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

news2024/9/23 1:28:55

这里进行之前需要把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})

接下来编译:

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

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

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

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

这里提醒缺少.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我研究发现不能自动调用其他地方的dll,但是内我又不想每个工程都copydll,这里做法是把那个exe可执行文件单独送到一个我文件夹,把对于的dll也拷贝到这个文件上即可进行调试了。具体如下:

附上完整的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})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes07:Service

Kubernetes07:Service 1、service存在的意义 因为Pod的IP是不断变化的&#xff0c;所以需要注册service防止pod失联 1&#xff09;为了防止Pod失联&#xff08;服务发现&#xff09; 2、定义一组Pod访问策略&#xff08;负载均衡&#xff09; 2、Pod和Service的关系-------通…

为什么要学习C++软件调试技术?掌握这类技术都有哪些好处?

目录 1、为什么要学习C软件调试技术&#xff1f; 1.1、IDE调试手段虽必不可少&#xff0c;但还不够 1.2、通过查看日志和代码去排查异常崩溃问题&#xff0c;费时费力&#xff0c;很难定位问题 1.3、有的问题很难复现&#xff0c;可能只在客户的环境才能复现 1.4、为了应对…

主打的就是I/O流,顺便把File复习了

文章目录1. File类1.1 预备知识1.2 创建文件1.3 文件的常用方法2. IO流2.1 InputStream2.2 OutputStream2.3 Reader2.4 Writer2.5 缓冲流2.6 转换流2.7 对象流2.8 打印流1. File类 1.1 预备知识 文件分隔符 Windows&#xff1a;D:\Soft\QQ\PluginLinux&#xff1a;D:/Soft/QQ…

SpringMVC使用 redis 实现缓存

简介 SpringMVC 中也可以将缓存标签和 redis 结合起来使用&#xff0c;其实此时缓存没有起作用&#xff0c;只是通过缓存的那几个注解来操作 redis 而已&#xff1b;SpringMVC 中整合 redis 比较麻烦的是注意版本冲突的问题&#xff0c;如下是官网有关于版本的要求 https://d…

【人脸识别】DDL:数据分布知识蒸馏思想,提升困难样本(遮挡、低分辨率等)识别效果

论文题目&#xff1a;《Improving Face Recognition from Hard Samples via Distribution Distillation Loss》 论文地址&#xff1a;https://arxiv.org/pdf/2002.03662v3.pdf 代码地址&#xff1a;https://github.com/HuangYG123/DDL 1.前言及相关工作 Large facial variatio…

秒懂算法 | 基于图神经网络的推荐算法

图神经网络(Graph Neural Networks,GNN)是近几年兴起的学科,用来作推荐算法自然效果也相当好,但是要学会基于图神经网络的推荐算法之前,需要对图神经网络自身有个了解。 图卷积网络(Graph Convolutional Networks,GCN)提出于2017年。GCN 的出现标志着图神经网络的出现。深度学习…

大家一起来找茬,新手第一次layout到底能挑出多少毛病?

有一个新手工程师在论坛上发了一篇帖子&#xff0c;把自己的处女PCB布线图贴出来。 如果不看其他网友的评论&#xff0c;你能看出多少问题呢&#xff1f;可以在留言区和我们互动哦~ 帖子里他还提出了自己的小见解&#xff1a;问一下&#xff0c;我觉得自动布线挺好用的啊&#…

汽车标定知识整理(一):标定简介与CCP报文协议简介

目录 一、什么是标定 二、XCP与CCP 三、CCP报文协议简介 1、CCP报文协议简介 &#xff08;1&#xff09;CRO&#xff1a;Command Receive Object &#xff0c;命令接收对象&#xff08;由Master -> Slave&#xff09; &#xff08;2&#xff09;DTO&#xff1a;Data T…

Kotlin 39. Dependency Injection依赖注入以及Hilt在Kotlin中的使用,系列2:手动依赖注入

一起来学Kotlin&#xff1a;概念&#xff1a;26. Dependency Injection依赖注入以及Hilt在Kotlin中的使用&#xff0c;系列2&#xff1a;手动依赖注入 此系列博客中&#xff0c;我们将主要介绍&#xff1a; Dependency Injection&#xff08;依赖注入&#xff09; 概念介绍。…

当IDEA加载一个MAVEN新项目时,加载不成功,无法加载依赖的解决方法

当IDEA加载一个MAVEN新项目时&#xff0c;加载不成功&#xff0c;无法加载依赖的解决方法 此文为练习项目时的错误记录 当使用IDEA引入一个MAVEN新项目时&#xff0c;点击Reload maven按钮加载不成功&#xff0c;显示如下图界面&#xff1a; 在项目中的代码显示报红&#xff0c…

urllib之ProxyHandler代理以及CookieJar的cookie内存传递和本地保存与读取的使用详解

处理更高级操作时(Cookies处理&#xff0c;代理设置)&#xff0c;需要一个强大的工具Handler&#xff0c;可以理解成各种处理器&#xff0c;有处理登录认证的、有处理Cookies的、有处理代理设置的。利用这些几乎可以做到HTTP请求中所有事情。当中urllib.request模块里的 BaseHa…

机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测

机器学习&#xff1a;基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞…

MySQL实战解析底层---基础架构:一条SQL查询语句是如何执行的?

目录 前言 连接器 查询缓存 分析器 优化器 执行器 前言 平时使用数据库&#xff0c;看到的通常都是一个整体比如&#xff0c;有个最简单的表&#xff0c;表里只有一个 ID 字段&#xff0c;在执行下面这个查询语句时&#xff1a; 看到的只是输入一条语句&#xff0c;返回…

微电影广告的内容突破方案

微电影作为新媒体时代背景的产物&#xff0c;深受大众的欢迎&#xff0c;同时&#xff0c;微电影广告在微电影模式环境下应运而生&#xff0c;以自己独特的传播优势&#xff0c;俘获了大量企业主的青睐&#xff0c;也获得了广大青年群体的喜爱。微电影广告欲确保可持续发展&…

Android App异常崩溃处理详解

异常崩溃是Android项目中一个棘手的问题&#xff0c;即使你做了很多的try - catch处理&#xff0c;也不能保证不崩溃&#xff0c;一旦崩溃就会出现下图的弹窗&#xff0c;xx应用就会停止运行这种体验对于用户来说是很差的&#xff0c;所以很明显我们做的app已经崩溃了。 像现在…

社科院与杜兰大学金融管理硕士项目——在这里共同改变,一起前行

人这一生&#xff0c;要走很长的路&#xff0c;才能确定前行的方向&#xff0c;在路上遇到很多的人&#xff0c;才知道与谁同行。在人生旅程中&#xff0c;保持怎样的姿态前行&#xff0c;往往与身边的人有很大关系。身边的人都很努力&#xff0c;你也会跟着努力上进。怀揣着在…

Synchronized,我要一层一层剥开你的心

三种应用方式 修饰实例方法&#xff0c;作用于当前实例加锁&#xff0c;进入同步代码前要获得当前实例的锁。修饰静态方法&#xff0c;作用于当前类对象加锁&#xff0c;进入同步代码前要获得当前类对象的锁。修饰代码块&#xff0c;指定加锁对象&#xff0c;对给定对象加锁&a…

TypeScript 使用 ES6 解构骚操作

TypeScript 使用 ES6 解构骚操作 文章目录TypeScript 使用 ES6 解构骚操作一、TypeScript 对象解构二、TypeScript 函数参数解构四、参考资料&#x1f498;五、推荐博文&#x1f357;一、TypeScript 对象解构 我们都知道 ES6 的数据解构功能很强大&#xff0c;一行命令就能够声…

HTMLCSS常见问题解决

文章目录一、解决img图片底部空白问题1、出现问题的效果2、原理3、解决方式3.1、将图片变为盒子3.2、处理基线3.3、把上级元素的字体大小改成0像素二、解决给子元素设置margin-top父子盒子都向下移动问题1、出现问题的效果2、原理3、解决方式3.1、给父元素设置边框3.2、给父元素…

程序员多赚20k的接私活必备网站

为什么都是程序员&#xff0c;就有人能多赚20k&#xff1f;那是因为副业搞得那么溜啊&#xff01; 今天分享一些程序员搞钱必备的接私活网站&#xff0c;让更多程序员们在工作之余能有另外一份收入。 1.程序员客栈&#xff1a;http://proginn.com 专为程序员服务的软件外包对…