windows 上使用纯 nvcc 命令编译 myboyhood/yolo-tensorrt 工程的过程记录

news2024/11/24 16:53:13

1. 码云仓库链接:https://gitee.com/myboyhood/yolo-tensorrt

2. 参考博客:

        1. 用C/C++写一个简单的音乐播放器(基于windows控制台编程):https://blog.csdn.net/lwx1051046458/article/details/128889992

3. 过程记录:

        1. 下载工程代码:

    git clone https://gitee.com/myboyhood/yolo-tensorrt.git

        2. 代码结构:

         3. 尝试编译:

                作者建议在ubuntu 上使用 cmake编译,在 windows 上使用 Visual Studio xxxx 编辑器使用打开 .sln 文件的方式打开此工程进行编译,因为我对 Visual Studio xxxx 不熟,感觉 vs 界面操作很难受,又要建属性表什么的,所以我这里使用原始的编译命令,因为在 windows 上使用 minGW、cymin 等的 g++ 无法编译使用了 cuda、tensorRT 等使用到操作系统底层硬件的项目,所以我这里使用 vs 中 msvc 自带的 cl.exe 工具来进行编译,例如我电脑上 cl.exe 的位置如下所示:

        复制博客 windows + tensorRT + yolov8 环境 mp4 视频物体检测测试( C++版本 ) 中的 cl语句如下:

cl ^
    -I"D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\include" ^
    -I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt" ^
    -I"D:\install\opencv\opencv\build\include" ^
    -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\include" ^
	-Fe"./build/test.exe" ^
	./src/test.cpp ^
    ./src/objectCheck.cpp ^
    -link libcpmt.lib ^
    -link kernel32.lib ^
    -link libucrt.lib ^
    -link cudart.lib ^
    -link nvinfer.lib ^
    -link opencv_world4100.lib ^
    -link opencv_world4100d.lib ^
    -LIBPATH:"D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\lib\x64" ^
    -LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\x64" ^
    -LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\x64" ^
    -LIBPATH:"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\lib\x64" ^
    -LIBPATH:"D:\install\opencv\opencv\build\x64\vc16\lib"

稍做修改,虽然我不熟悉 .sln工程,但是通过 .sln工程中的 .vcxproj 文件能获取一些有用的信息,比如参与编译的 .cpp、.c文件,需要包含的头文件目录,需要链接的库的目录和库名称等,接下来就是阅读 .vcxproj 文件,转换成等价 cl 编译语句。

        以  dll_detector 为例( props应该是 vs 生成的属性表,用于将为 Opencv、cuda等设置的头文件目录、库目录等持久化成的配置文件,要使用的直接导进去,不用每次新建工程都从零开始设置 ):

        打开 dll_detector.vcxproj 文件:

于是修改后的 cl 编译语句如下:

cl ^
    -I"D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\include" ^
    -I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt" ^
    -I"D:\install\opencv\opencv\build\include" ^
    -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\include" ^
	-I"D:\code\c_code\cpp_study_demo\vs2022\yolo-tensorrt\extra" ^
	-I"D:\code\c_code\cpp_study_demo\vs2022\yolo-tensorrt\modules" ^
	-Fe"./build/test.exe" ^
    ./samples/sample_detector.cpp ^
	./modules/calibrator.cpp ^
	./modules/class_detector.cpp ^
	./modules/ds_image.cpp ^
	./modules/plugin_factory.cpp ^
	./modules/trt_utils.cpp ^
	./modules/yolo.cpp ^
	./modules/yoloplugin_lib.cpp ^
	./modules/yolov2.cpp ^
	./modules/yolov3.cpp ^
	./modules/yolov4.cpp ^
	./modules/yolov5.cpp ^
	./modules/chunk.cu ^
	./modules/detect.cu ^
	./modules/hardswish.cu ^
	./modules/kernel.cu ^
	./modules/mish.cu ^
    -link libcpmt.lib ^
    -link kernel32.lib ^
    -link libucrt.lib ^
    -link cudart.lib ^
    -link nvinfer.lib ^
    -link opencv_world4100.lib ^
    -link opencv_world4100d.lib ^
    -LIBPATH:"D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\lib\x64" ^
    -LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\x64" ^
    -LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\x64" ^
    -LIBPATH:"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\lib\x64" ^
    -LIBPATH:"D:\install\opencv\opencv\build\x64\vc16\lib"

执行 cl 语句,报如下错:

trt_utils.cpp
D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\include\experimental/filesystem(29): 
fatal error C1189: #error:  The <experimental/filesystem> header providing std::experimental::filesystem is deprecated by Microsoft and will be REMOVED. 
It is superseded by the C++17 <filesystem> header providing std::filesystem. 
You can define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to suppress this error.

打开 trt_utils.cpp 文件,发现有如下内容:

#include "trt_utils.h"
#include <NvInferRuntimeCommon.h>

#ifdef HAVE_FILESYSTEM
#include <filesystem>
namespace fs = std::filesystem;
#else
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
#endif

确实是 trt_utils.cpp 导致的这个报错,于是在 trt_utils.h 中加入如下内容:

#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING

执行 cl语句,发现不报这个错了,但是会报如下错:

.\modules\chunk.cu : fatal error LNK1107: 文件无效或损坏: 无法在 0x18FB 处读取

出现损坏字样,难道真的是下载时出问题了,把 chunk.cu 注释掉执行 cl 语句,报如下错:

.\modules\detect.cu : fatal error LNK1107: 文件无效或损坏: 无法在 0x1D78 处读取

这时候已经能断定不是 .cu文件下载时损坏了导致的,应该是 cl 命令不支持 .cu文件的编译,研究了下有 .cu文件的应该算是 cuda 项目,应该使用 cuda 的 nvcc命令,直接将 cl 替换为 nvcc 试试,报错:

nvcc fatal   : Unknown option '-Fe./build/test.exe'

应该是 nvcc 不支持该写法,直接把这个删掉,即不手动指定 exe 文件的输出位置,执行报错:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\include\crt/host_config.h(153): fatal error C1189: #error:  -- unsupported Microsoft Visual Studio version! Only the versions between 2017 and 2022 (inclusive) are supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.

按照提示,在 nvcc 后面加上 -allow-unsupported-compiler 标记,执行,报错:

LINK : fatal error LNK1181: 无法打开输入文件“opencv_world4100.lib”

现在 .cu不报错了,但是 opencv 的 lib文件有链接不进来了,百度了下说是 nvcc 的语法和 cl 语法不太一样,应该将 

-LIBPATH:"D:\install\opencv\opencv\build\x64\vc16\lib"

换成 

 -LD:\install\opencv\opencv\build\x64\vc16\lib

将 

-link opencv_world4100.lib ^
-link opencv_world4100d.lib ^

换成

-lopencv_world4100 ^
-lopencv_world4100d ^

执行 nvcc 编译语句,控制台输入如下所示:

chunk.cu
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
detect.cu
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
hardswish.cu
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
kernel.cu
mish.cu
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include\NvInfer.h(6125): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
libcpmt.lib
kernel32.lib
libucrt.lib
cudart.lib
nvinfer.lib
  正在创建库 a.lib 和对象 a.exp
LINK : warning LNK4217:符号“??0Detector@@QEAA@XZ (public: __cdecl Detector::Detector(void))”(在“ tmpxft_0000397c_00000000-35_class_detector.obj”中定义)已由“tmpxft_0000397c_00000000-29_sample_detector.obj”(函数“main”中)导入
LINK : warning LNK4217:符号“??1Detector@@QEAA@XZ (public: __cdecl Detector::~Detector(void))”(在“ tmpxft_0000397c_00000000-35_class_detector.obj”中定义)已由“tmpxft_0000397c_00000000-29_sample_detector.obj”(函数“"public: void * __cdecl Detector::`scalar deleting destructor'(unsigned int)" (??_GDetector@@QEAAPEAXI@Z)”中)导入
LINK : warning LNK4217:符号“?init@Detector@@QEAAXAEBUConfig@@@Z (public: void __cdecl Detector::init(struct Config const &))”(在“ tmpxft_0000397c_00000000-35_class_detector.obj”中定义)已由“tmpxft_0000397c_00000000-29_sample_detector.obj”(函数“main”中)导入
LINK : warning LNK4217:符号“?detect@Detector@@QEAAXAEBV?$vector@VMat@cv@@V?$allocator@VMat@cv@@@std@@@std@@AEAV?$vector@V?$vector@UResult@@V?$allocator@UResult@@@std@@@std@@V?$allocator@V?$vector@UResult@@V?$allocator@UResult@@@std@@@std@@@2@@3@@Z (public: void __cdecl Detector::detect(class std::vector<class cv::Mat,class std::allocator<class cv::Mat> > const &,class std::vector<class std::vector<struct Result,class std::allocator<struct Result> >,class std::allocator<class std::vector<struct Result,class std::allocator<struct Result> > > > &))”(在“ tmpxft_0000397c_00000000-35_class_detector.obj”中定义)已由“tmpxft_0000397c_00000000-29_sample_detector.obj”(函数“main”中)导入

虽然看着挺吓人的,但是已经搜不出 'error' 字样了,都是一些 'warning' 信息,发现 a.exe 已经生成了,执行 a.exe,报错:

File does not exist : ../configs/yolov4-tiny.cfg
Assertion failed: fileExists(cfgFilePath), file D:\code\c_code\cpp_study_demo\vs2022\yolo-tensorrt\modules\yolo.cpp, line 985

应该在 configs 所在目录新建一个目录,比如叫 build,将 a.exe 复制进来,再执行 a.exe,控制台输出如下:

发现确实是在用显卡了,而且也出效果了,证明编译的 exe 应该是没问题的,只是目前不清楚该程序的作用,后面慢慢研究过吧...

最终完整的 nvcc_build.bat 如下:

nvcc  -allow-unsupported-compiler ^
    -I"D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\include" ^
    -I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt" ^
    -I"D:\install\opencv\opencv\build\include" ^
    -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\include" ^
	-I"D:\code\c_code\cpp_study_demo\vs2022\yolo-tensorrt\extra" ^
	-I"D:\code\c_code\cpp_study_demo\vs2022\yolo-tensorrt\modules" ^
    ./samples/sample_detector.cpp ^
	./modules/calibrator.cpp ^
	./modules/class_detector.cpp ^
	./modules/ds_image.cpp ^
	./modules/plugin_factory.cpp ^
	./modules/trt_utils.cpp ^
	./modules/yolo.cpp ^
	./modules/yoloplugin_lib.cpp ^
	./modules/yolov2.cpp ^
	./modules/yolov3.cpp ^
	./modules/yolov4.cpp ^
	./modules/yolov5.cpp ^
	./modules/chunk.cu ^
	./modules/detect.cu ^
	./modules/hardswish.cu ^
	./modules/kernel.cu ^
	./modules/mish.cu ^
    -link libcpmt.lib ^
    -link kernel32.lib ^
    -link libucrt.lib ^
    -link cudart.lib ^
    -link nvinfer.lib ^
    -lopencv_world4100 ^
	-lopencv_world4100d ^
    -LIBPATH:"D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\lib\x64" ^
    -LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\x64" ^
    -LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\x64" ^
    -LIBPATH:"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\lib\x64" ^
    -LD:\install\opencv\opencv\build\x64\vc16\lib

补充:

        其实 nvcc 进行编译,内部是需要调用 cl.exe的,例如将我电脑上将 D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\bin\Hostx64\x64 下的 cl.exe 修改下名称,执行 nvcc_build.bat 会如下错:

nvcc fatal   : Cannot find compiler 'cl.exe' in PATH

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

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

相关文章

Linux中新添加的磁盘信息不显示-主动扫盘(刷新磁盘状态)

在Linux系统中&#xff0c;当你新添加了一个磁盘&#xff08;无论是通过物理添加还是虚拟化环境&#xff09;&#xff0c;你可能需要让系统识别这个新磁盘&#xff0c;并且可能需要更新或“刷新”磁盘的状态。这通常涉及到几个步骤&#xff0c;但没有一个直接的“刷新磁盘状态”…

springboot集成nacos开启权限验证报错:user not found!

按照官网的说明对nacos的application.properties配置做了开启权限配置。 我的配置项&#xff1a; spring:cloud:nacos:discovery: #服务发现配置group: devnamespace: integrated-manage-dev password: integrated_manageusername: integrated_manageserver-addr: lo…

手把手教你实现基于丹摩智算的YoloV8自定义数据集的训练、测试。

摘要 DAMODEL&#xff08;丹摩智算&#xff09;是专为AI打造的智算云&#xff0c;致力于提供丰富的算力资源与基础设施助力AI应用的开发、训练、部署。 官网链接&#xff1a;https://damodel.com/register?source6B008AA9 平台的优势 &#x1f4a1; 超友好&#xff01; …

Java 延迟消息

场景 6S后执行任务 7天后发送订单 从现有时间算延后多少时间开始执行&#xff0c;当然也可以转换为在以后某个时间执行。 Timer类 Java中的Timer类是一个定时器&#xff0c;它可以用来实现延时消息的功能。 import java.util.Timer; import java.util.TimerTask;public c…

uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功

文章目录 导文是因为要添加服务器域名&#xff01; 导文 uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功 uniapp微信小程序体验版上传图片不成功 微信小程序本地和真机调试文件图片上传成功但体验版不成功 是因为要添加服务器域名&#xff01; 先看一下 你小程…

android13 第三方桌面不能使用后台历史任务问题 任务键功能失效问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.复现现象 3.问题分析 4.解决方法 5.编译运行 6.彩蛋 1.前言 随着Android 13操作系统的发布,用户现在可以更加自由地选择和使用第三方Launcher来定制自己的设备。本文将介绍在Android 13上安装和使用第三方Launcher导致…

工信部哪些证书可以考,含金量高吗

随着科技的快速发展和行业的不断变化&#xff0c;市场对人才的需求也在不断更新。技能提升可以帮助个人适应这些变化&#xff0c;满足新的岗位要求。同时学习新技能可以拓宽思维&#xff0c;激发创新意识&#xff0c;帮助我们在工作中找到新的解决方案。 泰迪智能科技专注…

楼宇智能化仿真实训室解决方案

在信息技术的浪潮中&#xff0c;智慧城市作为未来城市发展的新形态&#xff0c;正以前所未有的速度在全球范围内兴起。其中&#xff0c;楼宇智能化作为智慧城市的关键构成&#xff0c;扮演着举足轻重的角色。它不仅提升了建筑的能源效率、安全性与舒适度&#xff0c;还促进了城…

SQL Server 端口配置

目录 默认端口 更改端口 示例&#xff1a;更改 TCP 端口 示例&#xff1a;验证端口设置 远程连接测试 示例&#xff1a;使用 telnet 测试连接 配置防火墙 示例&#xff1a;Windows 防火墙设置 远程连接测试 示例&#xff1a;使用 telnet 测试连接 默认端口 TCP/IP: …

【Github】Github 上commit后 contribution 绿格子不显示 | Github绿格子 | Github贡献度不显示

一、Github 消失的绿点 1、贡献值为什么没了&#xff1f; 2、选择要显示的贡献 如下配置 二、如何解决消失的绿点&#xff1f; 1、添加邮箱 确保邮箱的设置必须选择一个邮箱邮箱 2、git config 添加邮箱 设置邮箱如下&#xff1a; git config --local user.email 316434776…

Tomcat IntelliJ IDEA整合

一、下载及安装Tomcat 下载官网&#xff1a;Apache Tomcat - Welcome! 1.点击红色框中的任意一个版本 2.点击下载 3.解压后放在任意路径&#xff08;我的是放在D盘&#xff09; 4.在bin目录下找到startup.bat&#xff0c;点击启动Tomcat 5.如果双击启动后&#xff0c;终端出…

NC 缺失的第一个正整数

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个无重…

无人机之交通管理篇

无人机技术已经渗透到社会的各个领域&#xff0c;其中交通监控与管理便是其应用的重要方向之一。无人机凭借其独特的优势&#xff0c;如高效性、灵活性、实时性等&#xff0c;为交通监控与管理带来了革命性的变革。 一、无人机在交通监控中的应用 1、实时监控与数据采集 无人…

cdga|数据治理策略:击破壁垒,迈向纵向一体化的新纪元

在当今这个数据驱动的时代&#xff0c;企业数据的价值日益凸显&#xff0c;它不仅是企业决策的重要依据&#xff0c;更是推动业务创新、优化运营流程、增强市场竞争力的关键要素。然而&#xff0c;随着数据量的爆炸性增长和数据来源的多样化&#xff0c;企业面临着数据孤岛、数…

时常在面试中被问到的JVM问题

文章目录 JVM 和 JDK、JRE 有什么区别&#xff1f;JVM 是如何工作的&#xff1f;JVM 主要组件JVM 执行流程JVM 的工作示例 说一下类加载机制类加载器&#xff08;Class Loader&#xff09;示例 什么是双亲委派模型&#xff1f;&#xff08;Parent Delegation Model&#xff09;…

时间同步的原理

1.问题来源&#xff1a; 设备A想要给设备B同步时间&#xff0c;最直接的办法&#xff0c;A发送当前时间到B&#xff0c;但这个问题会带来一些问题。 1.1 例子&#xff1a; 设备A&#xff08;后面叫Master设备&#xff09;现在拥有准确时间9点整, 设备B&#xff08;后面叫Sla…

TL-SEJ 方法:有效对抗语音伪造攻击

关键词&#xff1a;语音增强、迁移学习、模型鲁棒性、U-Net模型 随着人工智能技术的快速发展&#xff0c;基于深度学习的语音转换&#xff08;Voice Conversion, VC&#xff09;和文本到语音&#xff08;Text-to-Speech, TTS&#xff09;技术取得了显著的进步。这些语音合成技术…

性价比最高的蓝牙耳机有哪些推荐?四款高性价比蓝牙耳机盘点

目前蓝牙耳机已成为我们日常出行、工作乃至休闲娱乐的必备伴侣&#xff0c;它们不仅让我们摆脱了线缆的束缚&#xff0c;更以卓越的音质、高效的降噪能力和舒适的佩戴体验&#xff0c;极大地提升了我们的听觉享受&#xff0c;不过市面上耳机众多&#xff0c;性价比最高的蓝牙耳…

巴黎奥运会 为啥这么抠?

文&#xff5c;琥珀食酒社 作者 | 朱珀 你是不是挺无语的 这奥运会还没有开始呢 吐槽大会就停不下来了 接近40度的高温 公寓没有空调 奥运巴士也没空调 连郭晶晶老公霍启刚 这种见惯大场面的也破防了 你可能会问 好不容易搞个奥运会 干嘛还要抠抠搜搜的呀 在咱们看…

AI定制招聘策略:企业、候选人与市场三者融合之道

一、引言 在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为企业招聘的重要工具&#xff0c;能够根据企业需求、候选人特征和市场趋势制定个性化招聘策略。本文旨在探讨AI在招聘过程中的应用&#xff0c;分析它如何精准匹配企业与候选人&#xff0c;从而提高招…