天天看点

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

这里进行之前需要把protobuf在win10下编译,可以参考这篇文章

从Linux下载下来的工程代码,这里建议直接使用vs系列打开不要用vscode打开,vscode对win下的cmake不友好,主要体现在报错机制无法直接定位,题主的环境是vs2022通过cmake可以快速的进行定位bug,并可以快速解决(vscode 的cmake在Linux下还是比较友好的,但是通常如果在Linux下为什么 不研究makefile呢?),至于如何使用vs2022打开cmake工程,因为还没cmake文件,先创建一个空CMakeLists.txt, 直接在CMakeLists.txt文件夹右击选择vs2022打开,这样vs2022会自动打开cmake文件,也可以参考这篇文章,打开后先把CMakeLists文件的基本信息填上:

cmake_minimum_required(VERSION 3.10.0)
project(yolov5_detect_test VERSION 0.1.0)

# 设置语言版本
enable_language(CXX CUDA)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)

# 加入opencv库
set(OpenCV_DIR  "F:\\install\\thirdparty\\opencv\\build\\x64\\vc15\\lib")
find_package(OpenCV REQUIRED)
message(STATUS ${OpenCV_LIBS})

# 遍历工程源码
file(GLOB_RECURSE SRC_LIST DEPENDS "./src/*.cpp","src/*.cu","src/*.c")

# 引入外部的头文件
include_directories("./src")
include_directories("F:\\install\\thirdparty\\protobuf3.11.4\\include")
include_directories("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.7\\include")
include_directories("F:\\install\\thirdparty\\TensorRT-8.5.1.7.Windows10.x86_64.cuda-11.8.cudnn8.6\\TensorRT-8.5.1.7\\include")

# 引入外部的lib库文件
link_directories("F:\\install\\thirdparty\\TensorRT-8.5.1.7.Windows10.x86_64.cuda-11.8.cudnn8.6\\TensorRT-8.5.1.7\\lib")
link_directories("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.7\\lib\\x64")
link_directories("F:\\install\\thirdparty\\protobuf3.11.4\\lib")

add_executable(yolov5_detect_test ${SRC_LIST})

target_link_libraries(yolov5_detect_test libprotobufd cuda cudart nvinfer ${OpenCV_LIBS})
           

接下来编译:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

添加头文件#include <string>,代码格式问题是通过在vs中文件另保存,然后修改格式如下:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

保存好以后重新编译,会发现这个文件的没有错误了,但是main文件有大量的类似错误,其实也是编码格式文件:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

对main文件进行编码改变后,重新编译发现没有编码问题了,现在是缺少函数:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

这个问题是win中需要包含#include <shlwapi.h>头文件即可,然后重新编译,结果如下:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

这里提醒缺少.lib文件,说明没有找到,这里需要注意的是我这里工程是Debug模型,因此protobuf的库也需要debug的库,这里需要把一个import_lib.cpp文件加入即可,然后重新编译:

#if defined(_WIN32)
#    define U_OS_WINDOWS
#else
#   define U_OS_LINUX
#endif

#ifdef U_OS_WINDOWS
#if defined(_DEBUG)
#    pragma comment(lib, "opencv_world420d.lib")
#else
#    pragma comment(lib, "opencv_world420.lib")
#endif

//导入cuda
#pragma comment(lib, "cuda.lib")
#pragma comment(lib, "cudart.lib")
#pragma comment(lib, "cublas.lib")
#pragma comment(lib, "cudnn.lib")

//#pragma comment(lib, "Shlwapi.lib")


//导入tensorRT
#pragma comment(lib, "nvinfer.lib")
#pragma comment(lib, "nvinfer_plugin.lib")
//#pragma comment(lib, "nvparsers.lib")

#if defined(_DEBUG)
#pragma comment(lib, "libprotobufd.lib")
#else
#pragma comment(lib, "libprotobuf.lib")
#endif

#ifdef HAS_PYTHON
#pragma comment(lib, "python37.lib")
#endif

#endif // U_OS_WINDOWS
           

结果如下,发现还是保存,其实是因为缺少一个库和使用了protobuf的dll,需要消除即可,解决方法如下图,分别在import_lib.cpp中引入库,在cmake中加入消除警告即可,下图的那个放开的应该是#pragma comment(lib,"Shlwapi.lib"),画错了,然后重新编译:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

保存编译即可通过:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

调试的情况下,cmake我研究发现不能自动调用其他地方的dll,但是内我又不想每个工程都copydll,这里做法是把那个exe可执行文件单独送到一个我文件夹,把对于的dll也拷贝到这个文件上即可进行调试了。具体如下:

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译
使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译
使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

附上完整的cmake:

cmake_minimum_required(VERSION 3.10.0)
project(yolov5_detect_test VERSION 0.1.0)

# 设置语言版本
enable_language(CXX CUDA)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)

# 设置可执行文件目录
SET(EXECUTABLE_OUTPUT_PATH "F:\\BaiduNetdiskDownload\\tensorrt-integrate\\tensorrt-integrate\\tensorrt-integrate\\run")
# 消除警告
add_definitions(-w)
add_definitions(-DPROTOBUF_USE_DLLS) # 解决

# 加入opencv库
set(OpenCV_DIR  "F:\\install\\thirdparty\\opencv\\build\\x64\\vc15\\lib")
find_package(OpenCV REQUIRED)
message(STATUS ${OpenCV_LIBS})

# 遍历工程源码
file(GLOB_RECURSE SRC_LIST DEPENDS "./src/*.cpp","src/*.cu","src/*.c")

# 引入外部的头文件
include_directories("./src")
include_directories("F:\\install\\thirdparty\\protobuf3.11.4\\x64-Debug\\include")
include_directories("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.7\\include")
include_directories("F:\\install\\thirdparty\\TensorRT-8.5.1.7.Windows10.x86_64.cuda-11.8.cudnn8.6\\TensorRT-8.5.1.7\\include")

# 引入外部的lib库文件
link_directories("F:\\install\\thirdparty\\TensorRT-8.5.1.7.Windows10.x86_64.cuda-11.8.cudnn8.6\\TensorRT-8.5.1.7\\lib")
link_directories("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.7\\lib\\x64")
link_directories("F:\\install\\thirdparty\\protobuf3.11.4\\x64-Debug\\lib")

add_executable(yolov5_detect_test ${SRC_LIST})

target_link_libraries(yolov5_detect_test libprotobufd cuda cudart nvinfer ${OpenCV_LIBS})
           

继续阅读