【经验分享】win10|【经验分享】win10 qmake 构建 ncnn vs 工程

? 欢迎关注我的公众号 [极智视界],回复001获取Google编程规范
? O_o ? >_< ? o_O ? O_o ? ~_~ ? o_O
? 本教程详细记录了在 win10 环境中使用 qmake 构建 ncnn vs 工程的方法。
1、准备 opencv ?windows 上想要使用 opencv 很简单,opencv 官网提供了编译好的 windows 版本的库可以直接拿来用。
? 传送门:https://opencv.org/releases/
? 当然也可以选择源码编译 opencv,可以参考《【经验分享】windows 源码编译 opencv》。
2、编译 protobuf ?注意要用 vs2017 自带的终端 - 适用于 VS2017 的 X64 本机工具命令提示。
【经验分享】win10|【经验分享】win10 qmake 构建 ncnn vs 工程
文章图片

?下载 protobuf-3.4.0,传送:https://github.com/google/pro...
? 编译 protobuf:

cd mkdir build cd buildcall "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvarsall.bat" amd64cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmakenmake nmake install

? 编译完会在 build/install 下生成如下目录结构:
【经验分享】win10|【经验分享】win10 qmake 构建 ncnn vs 工程
文章图片

3、编译 ncnn ? clone ncnn 工程:
git clone --recursive https://github.com/Tencent/ncnn.git

? 编译 ncnn,其中 为上面下载的 protobuf 源码包路径:
cd mkdir -p build cd buildcall "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvarsall.bat" amd64cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=/build/install/include -DProtobuf_LIBRARIES=/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=/build/install/bin/protoc.exe -DNCNN_VULKAN=OFF ..nmake nmake install

? 编译完成后会在 build/install 下生成如下目录结构:
【经验分享】win10|【经验分享】win10 qmake 构建 ncnn vs 工程
文章图片

?且在 build/src 下会生成一些 .h 和 .cpp,会用于后面构建工程。以上就完成了 vs2017 构建 ncnn windows 版本库依赖的编译,下面进入 vs2017 构建。
4、vs2017 构建 ncnn ? 我这里使用 qmake 来构建 vs 工程。qmake 的 ncnn.pro 如下,从 pro 里可以看到构建 ncnn 工程时,会将前面的 opencv、protobuf、ncnn 编译出来的文件作为三方库了。
# ncnn.pro TEMPLATE = app CONFIG += console debug_and_release warn_on c++11 QT -= guiwin32 { QMAKE_CXXFLAGS += /MP /utf-8 }QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE+= $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFODebug:{ TARGET = ncnn DESTDIR= ./build/debug TEMP_DESTDIR = ./build/intermediate/debug/$$TARGET }Release:{ TARGET = ncnn DESTDIR= ./build/release TEMP_DESTDIR = ./build/intermediate/release/$$TARGET }MOC_DIR= $$TEMP_DESTDIR/moc RCC_DIR= $$TEMP_DESTDIR/rcc UI_DIR= $$TEMP_DESTDIR/qui OBJECTS_DIR= $$TEMP_DESTDIR/objwin32 { LIBS += -L./3rdparty/protobuf/lib/ libprotobuf.lib libprotobuf-lite.lib libprotoc.lib CONFIG(debug,debug|release){ LIBS += \ -L./3rdparty/opencv/x64/vc15/lib opencv_imgprocd.lib opencv_imgcodecsd.lib opencv_cored.lib opencv_dnnd.lib } CONFIG(release,debug|release){ LIBS += \ -L./3rdparty/opencv/x64/vc15/lib opencv_imgproc.lib opencv_imgcodecs.lib opencv_core.lib opencv_dnn.lib } }win32 { INCLUDEPATH+= \ ./3rdparty/opencv/include \ ./3rdparty/protobuf/include/google/protobuf \ ./3rdparty/ncnn/include/ncnn \ ./3rdparty/ncnn/src \ ./3rdparty/ncnn/src/layer/x86 }HEADERS += ./src/xxx.cpp \SOURCES += ./src/xxx.h \#CUDA_SOURCES += \win32 { SYSTEM_NAME = x64 SYSTEM_TYPE = 64 CUDA_ARCH = compute_35 CUDA_CODE = sm_35 CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"') MSVCRT_LINK_FLAG_DEBUG= "/MDd" MSVCRT_LINK_FLAG_RELEASE= "/MD" # Configuration of the Cuda compiler CONFIG(debug, debug|release) { # Debug mode cuda.input = CUDA_SOURCES cuda.output = $$OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj cuda.commands = $$PWD/./3rdparty/cuda/bin/nvcc.exe -D_DEBUG -Xcompiler $$MSVCRT_LINK_FLAG_DEBUG -c -Xcompiler $$join(QMAKE_CXXFLAGS,",") $$join(INCLUDEPATH,'" -I "','-I "','"') ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT} QMAKE_EXTRA_COMPILERS += cuda } else { # Release mode cuda.input = CUDA_SOURCES cuda.output = $$OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.obj cuda.commands = $$PWD/./3rdparty/cuda/bin/nvcc.exe -Xcompiler $$MSVCRT_LINK_FLAG_RELEASE -c -Xcompiler $$join(QMAKE_CXXFLAGS,",") $$join(INCLUDEPATH,'" -I "','-I "','"') ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT} QMAKE_EXTRA_COMPILERS += cuda } }

?再构建一个 create_vs_pro.bat:
# create_vs_pro.bat set PRO_FILE=ncnn.proset VC_DIR=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build call "%VC_DIR%\vcvars64.bat"set QT_5_9_8=C:\Qt\Qt5.9.8\5.9.8\msvc2015_64\bin set OPENCV_4_3_0=.\3rdparty\opencv\x64\vc15\bin set CUDA_11_0=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\binSET "PATH=%OPENCV_4_3_0%; %CUDA_11_0%; %PATH%"qmake -r -tp vc%PRO_FILE%pause

?双击 create_vs_pro.bat 就能生成 ncnn.sln,然后就可以进 vs studio 进行编译调试了。
【经验分享】win10|【经验分享】win10 qmake 构建 ncnn vs 工程
文章图片

? 需要注意的是,我这里是没有把 examples、tools、tests、benchmark 里大量的实用工具做成独立工程的形式,这些用到的时候再单独加到工程的 source 里就可以了。
? 其实 qmake 编译那块还有些细坑没写,琢磨一下应该能解决,若有问题欢迎联系我,希望我的分享能对你有一点帮助。
【【经验分享】win10|【经验分享】win10 qmake 构建 ncnn vs 工程】【公众号传送】
《【经验分享】win10 qmake 构建 ncnn vs 工程》

    推荐阅读