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 不再那么生硬。