使用 Visual Studio 2022 自带的 cl.exe 编译 tensorRT自带测试样例 sampleOnnxMNIST

  1. 新建任意文件夹,将 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sampleOnnxMNIST.cpp 文件复制进来,同时 D:\install\tensorRT\TensorRT-8.6.1.6\samples\sampleOnnxMNIST 下面的 sample_onnx_mnist.vcxproj 中的内容:
bash 复制代码
<ItemGroup>
    <ClCompile Include="sampleOnnxMNIST.cpp" />
    <ClCompile Include="../common/getopt.c" />
    <ClCompile Include="../common/logger.cpp" />
</ItemGroup>

预示着此样例还使用到了 getopt.c 和 logger.cpp 源文件,所以还要把 D:\install\tensorRT\TensorRT-8.6.1.6\samples\common 下面的 getopt.c 和 logger.cpp 复制进来。

  1. 猜测 sample_onnx_mnist.vcxproj 中的如下内容:
bash 复制代码
  <ClCompile>
      <AdditionalIncludeDirectories>..\..\include;..\common;..\common\windows;$(CUDA_PATH)\include;</AdditionalIncludeDirectories>
      <DisableSpecificWarnings>4244;4996</DisableSpecificWarnings>
  </ClCompile>

是指定 .h 头文件的目录,换成绝对路径就是如下所示:

bash 复制代码
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include
D:/install/tensorRT/TensorRT-8.6.1.6/samples/common
D:/install/tensorRT/TensorRT-8.6.1.6/include

因为安装 tensorRT 的时候,已经将 D:/install/tensorRT/TensorRT-8.6.1.6/include 下面的头文件复制到了 C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include 下面,所示实际不需要指定 D:/install/tensorRT/TensorRT-8.6.1.6/include 了。

  1. sample_onnx_mnist.vcxproj 中的如下内容:
bash 复制代码
 <Link>
      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);nvinfer.lib;nvinfer_plugin.lib;nvonnxparser.lib;nvparsers.lib;cudnn.lib;cublas.lib;cudart.lib;</AdditionalDependencies>
      <GenerateDebugInformation>false</GenerateDebugInformation>
      <SubSystem>Console</SubSystem>
 </Link>

格式化以后:

bash 复制代码
 <Link>
      <AdditionalDependencies>
            kernel32.lib;
            user32.lib;
            gdi32.lib;
            winspool.lib;
            comdlg32.lib;
            advapi32.lib;
            shell32.lib;
            ole32.lib;
            oleaut32.lib;
            uuid.lib;
            odbc32.lib;
            odbccp32.lib;%(AdditionalDependencies);
            nvinfer.lib;
            nvinfer_plugin.lib;
            nvonnxparser.lib;
            nvparsers.lib;
            cudnn.lib;
            cublas.lib;
            cudart.lib;
      </AdditionalDependencies>
      <GenerateDebugInformation>false</GenerateDebugInformation>
      <SubSystem>Console</SubSystem>
 </Link>

表示的应该是该样例需要链接的静态库,我们也不知道是什么作用,但是感觉:

bash 复制代码
        nvinfer.lib;
        nvinfer_plugin.lib;
        nvonnxparser.lib;
        nvparsers.lib;
        cudnn.lib;
        cublas.lib;
        cudart.lib;

这几个静态库是 cuda或者 tensorRT 的,肯定是需要的,这几个静态库文件在 C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/lib/x64 目录下( 可以使用 Everything 搜索 )。

4, 经过上面的初步分析,我们的 cl 编译语句如下:

bash 复制代码
cl ^
	-I"D:/install/tensorRT/TensorRT-8.6.1.6/samples/common" ^
	-I"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include" ^
	vs2022_cmake_sampleOnnxMNIST_test.cpp ^
	getopt.c ^
	logger.cpp ^
	-link nvinfer.lib ^
	-link nvinfer_plugin.Lib ^
	-link nvonnxparser.lib ^
	-link nvparsers.lib ^
	-link cudnn.lib ^
	-link cublas.lib ^
	-link cudart.lib ^
    -LIBPATH:"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/lib/x64"

执行报错 " 无法打开包括文件: "crtdefs.h": No such file or directory",使用 Everything 搜索 crtdefs.h:

于是将 D:\install\VisualStudio2022_comm\VC\Tools\MSVC\14.40.33807\include 也加入进头文件目录,即在 cl 语句中加入:

bash 复制代码
-I"D:/install/VisualStudio2022_comm/VC/Tools/MSVC/14.40.33807/include" ^

执行,报错 "无法打开包括文件: "corecrt.h": No such file or directory",搜索 corecrt.h:

于是在 cl 语句中加入:

bash 复制代码
-I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/ucrt" ^

执行,报错 " 无法打开包括文件: "windows.h": No such file or directory",搜索 windows.h:

于是在 cl 语句加入:

bash 复制代码
-I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um" ^

执行,报错 " 无法打开包括文件: "winapifamily.h": No such file or directory",搜索 winapifamily.h:

于是向 cl 语句中加入如下内容:

bash 复制代码
-I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared" ^

执行,报错 "LINK : fatal error LNK1104: 无法打开文件"libcpmt.lib"",搜索 libcpmt.lib:

于是向 cl 语句加入如下内容:

bash 复制代码
-link libcpmt.lib ^
-LIBPATH:"D:/install/VisualStudio2022_comm/VC/Tools/MSVC/14.40.33807/lib/x64"

执行,报错 "LINK : fatal error LNK1104: 无法打开文件"uuid.lib"",搜索 uuid.lib:

于是向 cl 语句加入如下内容:

bash 复制代码
-link uuid.lib ^
-LIBPATH:"C:/Program Files (x86)/Windows Kits/10/Lib/10.0.26100.0/um/x64"

执行,报错 "LINK : fatal error LNK1104: 无法打开文件"libucrt.lib"",搜索 libucrt.lib:

于是向 ci 语句添加如下内容:

bash 复制代码
-link libucrt.lib ^
-LIBPATH:"C:/Program Files (x86)/Windows Kits/10/Lib/10.0.26100.0/ucrt/x64"

最终生成的 cl 语句如下所示:

bash 复制代码
cl ^
	-I"D:/install/tensorRT/TensorRT-8.6.1.6/samples/common" ^
	-I"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/include" ^
	-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"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/um" ^
	-I"C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/shared" ^
	vs2022_cmake_sampleOnnxMNIST_test.cpp ^
	getopt.c ^
	logger.cpp ^
	-link nvinfer.lib ^
	-link nvinfer_plugin.Lib ^
	-link nvonnxparser.lib ^
	-link nvparsers.lib ^
	-link cudnn.lib ^
	-link cublas.lib ^
	-link cudart.lib ^
	-link libcpmt.lib ^
	-link uuid.lib ^
	-link libucrt.lib ^
    -LIBPATH:"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6/lib/x64" ^
	-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"
	

执行,成功生成 .exe 文件,运行 .exe 文件也是ok 的:

相关推荐
好喜欢吃红柚子6 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python11 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
正义的彬彬侠23 分钟前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
EricWang135833 分钟前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??35 分钟前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
羊小猪~~39 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨40 分钟前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测
发霉的闲鱼1 小时前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt1 小时前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
希言JY1 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言