基于Cmake+QT+VS+CUDA的跨平台编译Dlib+OpenCV项目

由于项目需求,需要跨平台编译Dlib+OpenCV,并借用MSVC编译器、Qt界面、CUDA加速。

经过摸索,成功实现跨平台编译。切入正题

参考文章:

https://www.cnblogs.com/JoyPoint/p/10549774.html,基于Cmake+QT+VS的C++项目构建开发编译简明教程

https://blog.csdn.net/u012234115/article/details/90642844?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task,机器学习库dlib的C++编译和使用(windows和linux)

————————————————————————

1. 所需工具和软件包

(1)Qt5.11.1, 使用MSVC2015_64编译器

(2)Visual Studio 2015 update3,安装“Qt Visual Studio Tools”、QtPackage扩展和更新

(3)Cmake-3.16.5-win64-x64

(4)CUDA-10.1,cudnn-10.1-windows7-x64-v7.6.5.32

(5)dlib-19.19.0

(6)opencv-4.1.2

(7)Anaconda3-4.2.0-Windows-x86_64(玩python时装的,cmake时会检索图片库)

2. 安装并配置环境变量

安装此处不再解释,默认安装,把自己需要的模块安装上就好

(1)Qt系统路径,D:\Qt\Qt5.11.1\5.11.1\msvc2015_64\bin;D:\Qt\Qt5.11.1\5.11.1\msvc2015_64\include;D:\Qt\Qt5.11.1\5.11.1\msvc2015_64\lib;

(2)VS系统路径,C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64;
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include;
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;

选择【QT VS Tools】-> 【Qt option】,添加Qt版本,名称“Qt5.11.1”,路径“D:\Qt\Qt5.11.1\5.11.1\msvc2015_64\”

(3)Cmake系统路径,D:\CMake;D:\CMake\bin;

并在系统变量中增加变量名:“CMAKE_PREFIX_PATH”,变量值:“D:\Qt\Qt5.11.1\5.11.1\msvc2015_64\lib\cmake

(4)CUDA系统路径,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\libnvvp;

C:\Program Files\NVIDIA Corporation\Nsight Compute 2019.3.0\;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;

(5)dlib不需要配

(6)openCV系统路径,D:\OpenCV412\opencv\build\include;
D:\OpenCV412\opencv\build\x64\vc14\bin;
D:\OpenCV412\opencv\build\x64\vc14\lib;
D:\OpenCV412\opencv\build;

(7)Anaconda3系统路径,D:\Program Files (x86)\Anaconda3;
D:\Program Files (x86)\Anaconda3\Scripts;
D:\Program Files (x86)\Anaconda3\Library\bin;

3. 基于Qt Creater构建,在VS中使用

Qt Widgets Application项目新建,选择MSVC2015 x64编译套件。

  • 用VS开发Qt Creater生成的项目:打开VS,选择【Qt VS Tools】,选择【Open Qt Project File(.pro)】,项目打开后即可直接修改、编译。

4. 基于CMake构建

dlib-19.19.0目录下创建以“CMakeLists.txt”命名的文本文件,其内容如下:

cmake_minimum_required(VERSION 2.8.12)




#############################################################################
#                                                                           #
#  READ examples/CMakeLists.txt TO SEE HOW TO USE DLIB FROM C++ WITH CMAKE  #
#                                                                           #
#############################################################################





get_directory_property(has_parent PARENT_DIRECTORY)
if(NOT has_parent)
   # When you call add_subdirectory(dlib) from a parent CMake project dlib's
   # CMake scripts will assume you want to statically compile dlib into
   # whatever you are building rather than create a standalone copy of dlib.
   # This means CMake will build dlib as a static library, disable dlib's
   # install targets so they don't clutter your project, and adjust a few other
   # minor things that are convenient when statically building dlib as part of
   # your own projects.
   #
   # On the other hand, if there is no parent CMake project or if
   # DLIB_IN_PROJECT_BUILD is set to false, CMake will compile dlib as a normal
   # standalone library (either shared or static, based on the state of CMake's
   # BUILD_SHARED_LIBS flag), and include the usual install targets so you can
   # install dlib on your computer via `make install`.  Since the only reason
   # to build this CMakeLists.txt (the one you are reading right now) by itself
   # is if you want to install dlib, we indicate as such by setting
   # DLIB_IN_PROJECT_BUILD to false.
   set(DLIB_IN_PROJECT_BUILD false)
endif()
add_subdirectory(dlib)

在上述目录下新建一个以“CMakeLists.txt”命名的文本文件,用Notepad编辑即可,其内容如下:

#设置cmake版本号
cmake_minimum_required(VERSION 3.4.0)
 
#设置工程名称
project(QtGuiDemo)
 
#设置工程包含当前目录,非必须
set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
#打开全局moc,设置自动生成moc文件,一定要设置
set(CMAKE_AUTOMOC ON)
#打开全局uic,非必须
set(CMAKE_AUTOUIC ON)
#打开全局rcc,非必须,如需打开,注意修改33行的qrc文件名
#set(CMAKE_AUTORCC ON)
 
#查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加
find_package(Qt5Widgets) 
find_package(Qt5Core)
find_package(Qt5Gui)
find_package( OpenCV REQUIRED )

include_directories( ${OpenCV_INCLUDE_DIRS})

include(../../PythonAlgorithm/dlib-19.19.0/dlib/cmake)
 
#查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量
FILE(GLOB SRC_FILES "./*.cpp")
#查找设置当前文件夹中所有的头文件
FILE(GLOB HEAD_FILES "./*.h")
#查找设置当前文件夹中所有的ui文件
FILE(GLOB UI_FILES "./*.ui")
 
#通过Ui文件生成对应的头文件,一定要添加
qt5_wrap_ui(WRAP_FILES ${UI_FILES})
 
#添加资源文件,非必须,一旦采用,注意修改相应的qrc文件名
#set(RCC_FILES rcc.qrc)
 
#将ui文件和生成文件整理在一个文件夹中,非必须
source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )
 
#创建工程文件
add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEAD_FILES} ${RCC_FILES} ${WRAP_FILES})
 
#添加Qt5依赖项
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} dlib::dlib)

运行Cmake-gui,源文件和目标文件选择不同的目录,会比较干净,后期好维护,如下:

基于Cmake+QT+VS+CUDA的跨平台编译Dlib+OpenCV项目_第1张图片

  • 勾选"Grouped"和"Advanced",便于列表项汇总扩展显示;点击"Configure"按钮,弹出生成环境选项,目标选择64位编译,选择"Visual Studio 14 2015",并选中"Use default native compilers"用缺省编译器,点击"Finish"按钮,进行安装配置
  • 经过短暂的等待,在窗口中出现若干红色选项,再次点击"Configure"按钮继续生成,红色消失;
  • 如还有红色选项出现,不需其他操作,继续"Configure",直到无红色选项,点"Generate"按钮,生成VS2015的解决方案等文件,提示"Generating done";(此步我未操作)

5. 用批处理方式进行CMake构建

  • 在此项目源文件目录下,新建cmake_build_vs2015_project.bat文本文件(该文件要求必须在项目源文件目录下,即与项目CMakeLists.txt文件同目录下),其内容如下(rem为注释):
@echo off
 
rem 获取项目CMakeLists.txt文件所在目录
set CURRENT_CMAKE_DIR=%~dp0
 
rem 获取项目CMakeLists.txt文件所在目录的名称,用于新建构建目录
for /f "delims=" %%i in ("%cd%") do set CURRENT_DIR_NAME=%%~ni
 
rem 到项目CMakeLists.txt文件所在目录的上级目录
cd..
 
rem 获取当前目录,%cd%与%~dp0的区别在于获取的目录尾部少了“\”
set CURRENT_DIR=%cd%
 
rem 设置需要外部构建的目录名称,在源文件目录后面加“_build”
set PROJECT_NAME=%CURRENT_DIR_NAME%_build
 
rem 设置外部构建的完整路径
set CURRENT_NEW_DIR=%CURRENT_DIR%\%PROJECT_NAME%
echo Cmake in [%CURRENT_NEW_DIR%]
 
rem 判断是否已经存在外部构建的路径,如果存在删除
if exist %CURRENT_NEW_DIR% (
    rd /s/q %CURRENT_NEW_DIR%
)
 
rem 新建外部构建目录
mkdir %CURRENT_NEW_DIR%
 
rem 进入新建的外部构建目录,用于Cmake生成项目文档
cd %CURRENT_NEW_DIR%
 
rem 根据编译环境需要设定VS版本,%CURRENT_CMAKE_DIR%用于指定CMakeLists.txt所在目录,-G 用于指定makefile的生成工具
::cmake ../ -G "Visual Studio 14 2015 Win64"
::cmake ../ -G "Visual Studio 14 2015 ARM"
cmake %CURRENT_CMAKE_DIR% -G "Visual Studio 14 2015 Win64" -T host=x64 
 
cd..
 
rem 查看构建项目的目录树
tree %CURRENT_NEW_DIR% /f
 
pause
  • 在此项目源文件目录下,运行cmd,进入命令提示符窗口,执行cmake_build_vs2015_project.bat
  • 为什么需要CMake构建项目,主要是在实际项目中,经常会用到多个第三方库,或复杂项目结构,用Qt Creater(qmake)或VS构建,过程会变得很繁琐,一旦设置有误,就会出现很多编译错误,特别是用VS加载第三方库,因此,对简单的Qt工程,采用 qmake或VS,对复杂度高的或需加载多个第三方库的,采用cmake。

等待一段时间后,构建完成。

基于Cmake+QT+VS+CUDA的跨平台编译Dlib+OpenCV项目_第2张图片

6. 使用VS打开CmakeQtGuiDemo_build内工程

执行工程,会提示#error "Don't put the dlib folder in your include path"

基于Cmake+QT+VS+CUDA的跨平台编译Dlib+OpenCV项目_第3张图片

  • 打开CmakeQtGuiDemo_build、CmakeQtGuiDemo_build/dlib_build目录下的所有ALL_BUILD.vcxproj、QtGuiDemo.sln、QtGuiDemo.vcxproj、ZERO_CHECK.vcxproj、ALL_BUILD.vcxproj、dlib.sln、dlib.vcxproj
  • 搜索,将所有“dlib-19.19.0\dlib;”替换为“dlib-19.19.0”,就可以消除该Error。

7. 重新执行

在release模式下,重新执行工程,这时即可完成工程创建,并将Qt依赖文件复制到目录即可。

基于Cmake+QT+VS+CUDA的跨平台编译Dlib+OpenCV项目_第4张图片

基于Cmake+QT+VS+CUDA的跨平台编译Dlib+OpenCV项目_第5张图片

你可能感兴趣的:(cmake,qt,visual,studio,opencv,cuda)