WSL2和Windows沙盒是目前Windows平台最常用的测试环境,Windows沙盒可以用来校正全新环境下自己开发的软件是否正常运行,而WSL2可以校准Linux环境下的应用是否正常运行。
0. 效果截图
1. 为啥要用WSL2?
测试一些不容易跨端的编程语言,比如C++。最近我开发了多个人工智能APP,其核心依赖C++,使用cmake构建的c++程序只能本地编译。
2. WSL2环境安装
在微软应用商店搜索Linux
,就可以找到比较熟悉的Ubantu
、Debian
等等,随便安装一个即可。
3. Opencv安装
c++的通用安装步骤,clone代码,cmke创建build工程,然后make完成打包和安装。
# 基础工具
apt install build-essential cmake git pkg-config
# opencv clone
mkdir ~/opencv_build && cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
# 创建build工程
cd ~/opencv_build/opencv
mkdir -p build && cd build
# cmke
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..
# 等待一分钟完成输出
# 开始构建,数字20可以改成你的CPU实际线程数,越多构建速度越快
make -j20
# 等待2分钟即可完成所有构建过程
# 最后一步,完成install,这样就可以通过findpackage找到
sudo make install
检查是否正确安装:
pkg-config --modversion opencv4
成功后会输出如上结果。
4. NCNN安装
基本符合C++的通用安装步骤
# 安装基础依赖
apt install libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils
# clone代码
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
# 创建build工程
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
# 等待1分钟完成cmake过程
# 开始构建,数字20可以改成你的CPU实际线程数,越多构建速度越快
make -j20
# 等待3秒钟即可完成所有构建过程
# 最后一步,完成install,这样就可以通过findpackage找到
sudo make install
验证安装
cd ../examples
../build/examples/squeezenet ../images/256-ncnn.png
[0 AMD RADV FIJI (LLVM 10.0.1)] queueC=1[4] queueG=0[1] queueT=0[1]
[0 AMD RADV FIJI (LLVM 10.0.1)] bugsbn1=0 buglbia=0 bugcopc=0 bugihfa=0
[0 AMD RADV FIJI (LLVM 10.0.1)] fp16p=1 fp16s=1 fp16a=0 int8s=1 int8a=1
532 = 0.163452
920 = 0.093140
716 = 0.061584
5. Cocoyaxi安装
这是一个类Go语言的协程库,go和chanel都有,可以按照go语言的思维快速开发高并发程序
# clone代码
git https://github.com/idealvin/cocoyaxi.git
cd cocoyaxi
# 创建build工程
mkdir -p build && cd build
cmake ..
# 等待1分钟完成cmake过程
# 开始构建,数字20可以改成你的CPU实际线程数,越多构建速度越快
make -j20
# 等待1秒钟即可完成所有构建过程
# 最后一步,完成install,这样就可以通过findpackage找到
sudo make install
6. 整合所有这些环境
在Windows中打开终端工具,输入wsl或手动进入WSL2子系统,然后输入code .
即可打开vscode工具,创建一个CMakeLists.txt
文件,内容如下:
cmake_policy(SET CMP0091 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0091 NEW) # 确实解决内部cmake中文乱码的问题
cmake_minimum_required(VERSION 3.9) # 定义cmake最小版本号
set(CMAKE_BUILD_TYPE Release)
# Create project
set(ProjectName "cpp") # 定义变量
project(${ProjectName}) # 定义项目名称
message("ProjectName: ${ProjectName}") # 打印项目名称
add_executable(${ProjectName} main.cpp) # 定义编译的程序名称和程序文件
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) # 输出成功,但是Release\yolov5.exe
# 设置 opencv
find_package(OpenCV REQUIRED)
target_link_libraries(${ProjectName} ${OpenCV_LIBS})
set(ncnn_DIR "/root/ncnn_build/ncnn/build/install/lib/cmake/ncnn") # ncnn编译后,lib文件里包含ncnnconfig.camke的目录
find_package(ncnn REQUIRED)
target_link_libraries(${ProjectName} ncnn) # 在项目中使用,缺少会报错
# # 并发库
find_package(cocoyaxi REQUIRED)
target_link_libraries(${ProjectName} cocoyaxi::co)
这样就算完整了,然后为了方便可以使用pyton来自动化这个过程,如果需要实时动态编译,可以调用go语言的gowatch工具对该项目进行实时编译,实现修改后所见即所得的效果。
此处列举python自动化脚本
import os
os.system("cmake -B.build .") # 代表编译缓存
os.system("cmake --build .build --config Release --target cpp -- -j20") # 执行前其实还有缓存这一步
os.system('./cpp')
众所周知,不论前端还是后端,临时文件都用.XXX
文件,方便识别核心代码与自生成冗余文件。
7. 小结
最近学习C++并完成了多个AI应用的开发,整体而言C++现代编程虽然比较容易,但是面对较复杂的应用时,尤其是对比Go语言几乎没有优势。想要开发复杂多变的现实应用,Go语言仍然比C++更合适,也许未来某一天我会实现Go语言直接调用C++,让愚蠢的AI迈向魔法系,让AI不再那么生硬。