从零搭建TensorRT C++开发环境:g++、CMake与VS Code实战指南
1. 项目概述:为什么需要搭建C++的TensorRT环境?
如果你已经跟着前几篇内容,用Python玩转了TensorRT,可能会觉得“部署”这事儿已经手到擒来了。但当你真正要把模型塞进一个没有Python解释器、资源受限的生产环境(比如嵌入式设备、高性能服务器或者某些客户端应用)时,C++就成了唯一的选择。Python的便利性背后是动态解释和庞大的运行时库,而C++能提供极致的性能控制和最小的二进制体积。TensorRT的核心引擎本身就是用C++写的,其C++ API提供了最直接、最底层的控制能力,能让你精细地管理内存、流和推理过程。
这个项目标题“从零开始 TensorRT(5)C++ 篇:g++、CMake、VS Code 环境入门”,直指一个核心痛点:从Python的舒适区跨入C++的“硬核”世界,第一步往往就卡在了环境搭建上。g++、CMake、VS Code——这三个工具构成了现代C++开发,特别是在Linux环境下进行深度学习部署的黄金三角。g++是编译器,负责把源代码变成机器码;CMake是构建系统生成器,用来管理复杂的编译依赖和过程;VS Code则是一个轻量级但功能强大的编辑器,提供代码编写和调试的界面。把这套环境理顺,是后续进行TensorRT C++应用开发、插件编写乃至性能调优的基石。
2. 环境整体设计与工具链选型思路
搭建C++开发环境,尤其是涉及TensorRT这样的重型库,最忌讳的就是“一把梭”安装。不同的工具版本、系统库依赖之间可能存在微妙的兼容性问题。因此,一个清晰、可复现的环境搭建思路至关重要。
2.1 核心工具链解析与选型理由
1. 编译器:GCC/g++在Linux世界,GCC(GNU Compiler Collection)是事实上的标准,其C++编译器就是g++。选择g++而非Clang,主要是出于最广泛的兼容性考虑。TensorRT的官方文档和预编译库通常都基于GCC进行测试。对于初学者,使用系统包管理器(如apt、yum)安装的g++能最大程度减少环境冲突。我们通常需要g++ 7.4.0或更高版本来支持C++14/17标准,这是现代C++库(包括TensorRT的部分示例)所依赖的。
2. 构建系统:CMake为什么是CMake而不是简单的Makefile?当你的项目开始依赖像TensorRT、CUDA、OpenCV、Protobuf等多个外部库时,手动编写Makefile来定位头文件、链接库路径会变得异常繁琐且容易出错。CMake通过一个声明式的CMakeLists.txt文件来描述构建过程,它能自动查找系统中的库,并生成对应平台(Unix Makefiles, Ninja, VS工程等)的本地构建文件。这种“编写一次,到处构建”的能力,是项目可维护性和团队协作的基础。
3. 编辑器/IDE:Visual Studio CodeVS Code并非传统的重量级IDE(如CLion或Visual Studio),但它凭借强大的扩展生态系统和轻量级特性,在C++开发中占据了重要地位。通过安装“C/C++”和“CMake Tools”扩展,VS Code能提供近乎IDE的体验:智能代码补全(IntelliSense)、跳转到定义、CMake项目自动配置、图形化构建和调试等。对于在Linux服务器或远程开发场景下工作,VS Code的远程开发扩展更是无可替代。
4. 版本管理思想在开始之前,请树立一个核心思想:记录所有版本。创建一个简单的environment.md文件,记录下你安装的g++版本(g++ --version)、CMake版本(cmake --version)、CUDA版本(nvcc --version)、TensorRT版本以及系统Linux发行版。当出现诡异错误时,这份记录是排查兼容性问题的第一手资料。
2.2 环境搭建的两种路径与选择
根据你的工作场景,主要有两种环境搭建路径:
- 本地Linux环境:这是最直接、性能最好的方式。你可以在Ubuntu等发行版的物理机或虚拟机上直接操作。所有工具都原生运行,没有性能损耗。
- Windows下的WSL2(Windows Subsystem for Linux 2)环境:这是Windows用户的首选方案。WSL2提供了一个完整的Linux内核,让你能在Windows上无缝运行Linux命令行工具。TensorRT的C++开发强烈推荐在WSL2的Ubuntu中进行,因为它能直接使用NVIDIA为Linux提供的CUDA驱动,完美兼容TensorRT。切记,避免尝试在纯Windows的Visual Studio中直接配置TensorRT C++环境,那是一条充满荆棘的“hard模式”道路,涉及复杂的DLL、路径和编译器兼容性问题。
本项目将主要以WSL2 + Ubuntu作为标准环境进行阐述,其步骤与纯本地Linux环境几乎完全一致。
3. 基础环境搭建实操详解
3.1 WSL2与Ubuntu系统准备
如果你使用Windows,这是第一步也是关键一步。
- 启用WSL功能:以管理员身份打开PowerShell,运行
wsl --install。这个命令会默认安装Ubuntu发行版。如果系统提示需要,你可能需要手动在“启用或关闭Windows功能”中勾选“适用于Linux的Windows子系统”和“虚拟机平台”,然后重启。 - 设置WSL版本:安装后,确保WSL2是默认版本。在PowerShell中执行
wsl --set-default-version 2。 - 安装Ubuntu:从Microsoft Store安装“Ubuntu 22.04 LTS”或“Ubuntu 20.04 LTS”。TensorRT对这两个长期支持版本兼容性最好。安装后,首次运行会要求你创建Linux用户名和密码。
- 配置WSL2与Windows的文件互访:你可以在Linux中通过
/mnt/c/访问Windows的C盘。但反过来,Windows文件资源管理器地址栏输入\\wsl$即可访问WSL的文件系统。建议将代码项目放在WSL的文件系统内(如/home/yourname/projects/),以获得更好的I/O性能。
3.2 g++编译器安装与验证
打开你的Ubuntu终端(WSL2或本地Linux)。
- 更新软件源:首先运行
sudo apt update,刷新软件包列表。 - 安装g++:执行
sudo apt install g++。这个命令会安装当前Ubuntu仓库中默认版本的g++(Ubuntu 22.04通常是g++-11,20.04是g++-9)。 - 验证安装:安装完成后,运行
g++ --version。你会看到类似以下的输出:
这确认了g++已成功安装。如果你的项目需要特定版本(例如某些旧代码要求g++-7),可以使用g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation, Inc.sudo apt install g++-7来安装,并通过update-alternatives命令来管理多个编译器版本。
注意:在安装g++时,系统可能会提示你“需要下载XX MB的归档文件”。这是正常的,它包含了编译器运行时库等必要组件。确保你的网络连接通畅。
3.3 CMake安装与升级指南
Ubuntu的默认仓库中的CMake版本可能较旧。TensorRT和一些现代C++项目可能需要更高版本的CMake(如3.10以上)。
方法一:使用APT安装(简单,但版本可能旧)sudo apt install cmake安装后使用cmake --version检查。如果版本满足要求(≥3.10),此方法足矣。
方法二:通过官方脚本安装最新版(推荐)如果默认版本太低,建议使用Kitware提供的官方脚本安装。
- 首先卸载旧版(可选):
sudo apt remove --purge cmake - 下载安装脚本:
注意:上述命令中的wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null sudo apt updatejammy对应Ubuntu 22.04,如果是20.04请替换为focal。 - 安装CMake:
sudo apt install cmake - 再次验证版本:
cmake --version,现在你应该能看到一个较新的版本(如3.28+)。
方法三:从源码编译安装(最灵活,但稍复杂)当需要特定版本或遇到极端情况时使用。
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3.tar.gz tar -xzvf cmake-3.28.3.tar.gz cd cmake-3.28.3 ./bootstrap make -j$(nproc) # 使用所有CPU核心加速编译 sudo make install安装后,可能需要重启终端或运行hash -r让系统识别新安装的cmake命令。
3.4 VS Code及其关键扩展配置
- 安装VS Code:从 VS Code官网 下载并安装Windows版本的VS Code。
- 安装“Remote - WSL”扩展:这是连接WSL2的桥梁。在VS Code的扩展商店搜索并安装“Remote - WSL”。
- 连接WSL:点击VS Code左下角的绿色远程连接图标(或按
Ctrl+Shift+P打开命令面板,输入“Remote-WSL: New WSL Window”),选择你安装的Ubuntu发行版。此时,VS Code会在WSL中安装一个轻量级服务器,然后打开一个新窗口。这个窗口的终端就是WSL的终端,所有操作都在Linux环境中进行。 - 安装核心C++扩展:在已连接到WSL的VS Code窗口中,安装以下扩展:
- C/C++(由Microsoft发布):提供IntelliSense、代码导航、调试支持。
- CMake Tools(由Microsoft发布):提供CMake项目的集成支持,包括配置、构建、运行、测试和调试。
- (可选)CMake(由twxs发布):提供CMakeLists.txt的语法高亮。
安装完成后,你的开发环境主体就准备好了。接下来,我们需要一个“试金石”项目来验证整个工具链是否通畅。
4. 第一个CMake C++项目:从Hello World到链接TensorRT
4.1 创建项目结构与CMakeLists.txt
让我们从一个最简单的项目开始,逐步增加复杂度,直到链接TensorRT库。
- 创建项目目录:在WSL的home目录下,创建一个新目录并打开VS Code。
cd ~ mkdir tensorrt_cpp_test && cd tensorrt_cpp_test code . # 这会用已连接WSL的VS Code打开当前目录 - 创建源代码文件:在VS Code的资源管理器中,新建一个
main.cpp文件。#include <iostream> int main() { std::cout << "Hello, TensorRT C++ World!" << std::endl; return 0; } - 创建CMakeLists.txt:这是CMake的构建脚本。在项目根目录创建
CMakeLists.txt。
这个最简单的CMakeLists.txt完成了三件事:定义项目、设置C++标准、指定要构建的可执行文件。# 指定CMake的最低版本要求 cmake_minimum_required(VERSION 3.10 FATAL_ERROR) # 定义项目名称和使用的编程语言 project(tensorrt_cpp_test LANGUAGES CXX) # 设置C++标准(TensorRT示例常用C++14) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 添加可执行目标,将main.cpp编译成名为`test_app`的可执行文件 add_executable(test_app main.cpp) # 设置输出目录(可选,让生成的可执行文件在项目根目录的bin文件夹下) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
4.2 使用CMake配置与构建项目
现在,利用VS Code的CMake Tools扩展来构建项目。
- CMake: Configure:按
Ctrl+Shift+P,输入“CMake: Configure”,选择“GCC x.x.x...”作为工具链(Kit)。CMake Tools会自动检测到你系统中的g++。首次配置时,它会在项目根目录生成一个build文件夹,并在其中生成CMakeCache.txt等文件。 - 观察输出:查看VS Code底部的终端面板,CMake会输出配置过程,最后显示“Configuring done”和“Generating done”。
- CMake: Build:再次按
Ctrl+Shift+P,输入“CMake: Build”。或者点击底部状态栏的“Build”按钮。构建成功后,终端会显示“Built target test_app”。 - 运行程序:你可以在终端中手动运行生成的可执行文件:
如果一切顺利,你将看到输出:cd ~/tensorrt_cpp_test ./build/bin/test_appHello, TensorRT C++ World!。
至此,你已成功打通了g++->CMake->VS Code的核心工具链。但这只是一个开始,真正的挑战在于引入外部库。
4.3 引入TensorRT:配置CMake查找库
假设你已经按照TensorRT官方指南,在/usr/local/tensorrt路径下安装了TensorRT(通常包含include、lib、bin等子目录)。我们的目标是在CMake中正确找到并链接它。
修改你的CMakeLists.txt,在add_executable之后添加内容:
# ... 前面的内容保持不变 ... add_executable(test_app main.cpp) # 1. 寻找TensorRT包。 # `find_package` 命令会尝试查找名为 TensorRT 的包配置文件。 # `REQUIRED` 表示必须找到,否则配置失败。 # `CONFIG` 模式告诉CMake使用TensorRT提供的 `<PackageName>Config.cmake` 文件。 find_package(TensorRT REQUIRED CONFIG) # 2. 如果找到,打印相关信息(调试用,可选) if(TensorRT_FOUND) message(STATUS "Found TensorRT version: ${TensorRT_VERSION}") message(STATUS "TensorRT include dir: ${TensorRT_INCLUDE_DIRS}") message(STATUS "TensorRT libraries: ${TensorRT_LIBRARIES}") endif() # 3. 将TensorRT的头文件目录链接到我们的目标 target_include_directories(test_app PRIVATE ${TensorRT_INCLUDE_DIRS}) # 4. 将TensorRT的库文件链接到我们的目标 target_link_libraries(test_app PRIVATE ${TensorRT_LIBRARIES}) # 5. 如果你的代码使用了CUDA(TensorRT通常依赖),还需要找到CUDA find_package(CUDA REQUIRED) target_include_directories(test_app PRIVATE ${CUDA_INCLUDE_DIRS}) # TensorRT的find模块通常已经链接了cuda等库,但显式链接更稳妥 target_link_libraries(test_app PRIVATE ${CUDA_LIBRARIES}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)同时,修改main.cpp,加入一个简单的TensorRT头文件引用以测试链接是否成功:
#include <iostream> #include <NvInfer.h> // TensorRT的核心头文件 int main() { std::cout << "Hello, TensorRT C++ World!" << std::endl; // 尝试创建一个空的ILogger接口,验证链接 class Logger : public nvinfer1::ILogger { void log(Severity severity, const char* msg) noexcept override { std::cout << "[TensorRT] " << msg << std::endl; } } logger; std::cout << "TensorRT header included and linked successfully!" << std::endl; return 0; }现在,再次执行CMake: Configure。这是关键一步。
- 如果成功:你会在CMake输出中看到
Found TensorRT version: x.x.x.x等信息,然后正常构建和运行。 - 如果失败:最常见的错误是
Could not find a package configuration file provided by "TensorRT"。这意味着CMake在默认的搜索路径下找不到TensorRT的配置文件(TensorRTConfig.cmake)。
4.4 解决TensorRT库查找失败问题
当find_package失败时,你需要手动告诉CMake TensorRT的安装路径。有两种主要方法:
方法一:在CMakeLists.txt中指定路径(不推荐硬编码)
# 在 find_package 前,设置 TensorRT_DIR 变量指向包含 TensorRTConfig.cmake 的目录 set(TensorRT_DIR /usr/local/tensorrt/lib/cmake/tensorrt) find_package(TensorRT REQUIRED CONFIG)方法二:在调用CMake时通过命令行参数传递(推荐,更灵活)在VS Code中,你可以修改CMake的配置变量。按Ctrl+Shift+P,输入“CMake: Edit User-Local CMake Kits”,在打开的cmake-kits.json文件中,可以为特定工具链添加环境变量或CMake变量。更简单的方式是,在项目根目录创建一个CMakePresets.json文件来管理预设。
方法三:将TensorRT路径添加到系统环境变量(一劳永逸)在WSL/ Linux的shell配置文件(如~/.bashrc)中添加:
export TENSORRT_ROOT=/usr/local/tensorrt export LD_LIBRARY_PATH=$TENSORRT_ROOT/lib:$LD_LIBRARY_PATH然后让CMake知道这个路径。修改CMakeLists.txt中的find_package部分:
# 尝试从环境变量中获取路径 if(DEFINED ENV{TENSORRT_ROOT}) set(TensorRT_DIR $ENV{TENSORRT_ROOT}/lib/cmake/tensorrt) endif() find_package(TensorRT REQUIRED CONFIG)实操心得:我强烈推荐方法三。将第三方库的根目录通过环境变量(如
TENSORRT_ROOT、CUDA_PATH)管理,然后在CMakeLists.txt中通过$ENV{VAR_NAME}引用,是一种非常清晰且可移植的模式。它避免了在代码中硬编码绝对路径,方便在不同机器或容器中复用项目配置。
成功配置并构建后,运行./build/bin/test_app,如果程序能正常启动并打印出包含TensorRT的信息,那么恭喜你,你的C++ TensorRT开发环境已经完全搭建成功。
5. VS Code高级配置与调试技巧
环境搭好是基础,用起来顺手才是关键。VS Code的几个关键配置能极大提升开发效率。
5.1 配置C/C++ IntelliSense
IntelliSense(智能感知)是代码补全、参数提示、错误波浪线的核心。它依赖于一个名为c_cpp_properties.json的配置文件。你可以按Ctrl+Shift+P,输入“C/C++: Edit Configurations (UI)”来图形化配置,或者直接修改项目.vscode/c_cpp_properties.json文件。
一个针对TensorRT项目的配置示例如下:
{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/usr/local/tensorrt/include", // 手动添加TensorRT头文件路径 "/usr/local/cuda/include" // 手动添加CUDA头文件路径 ], "defines": [], "compilerPath": "/usr/bin/g++", "cStandard": "c17", "cxxStandard": "c++14", "intelliSenseMode": "linux-gcc-x64", "configurationProvider": "ms-vscode.cmake-tools" // 让CMake Tools提供配置 } ], "version": 4 }最关键的是"configurationProvider": "ms-vscode.cmake-tools"这一行。当CMake Tools成功配置项目后,它会自动将CMake中定义的所有头文件路径、宏定义等信息传递给C/C++扩展,这样IntelliSense就能准确识别你的项目依赖,实现精准的代码补全和跳转。手动添加的includePath可以作为备用路径。
5.2 使用CMake Tools进行高效构建与调试
CMake Tools扩展将构建、运行、调试流程深度集成到了VS Code中。
- 底部状态栏:配置成功后,底部状态栏会显示当前活动的构建目标(如
test_app)、构建类型(如Debug)、使用的工具链。你可以直接在这里点击进行构建、运行、调试。 - 快速构建与运行:
- 构建:
Ctrl+Shift+P-> “CMake: Build”,或点击状态栏的“Build”按钮,或直接按F7(默认快捷键)。 - 运行:
Ctrl+Shift+P-> “CMake: Run Without Debugging”,或点击状态栏的“Play”按钮。 - 调试:
Ctrl+Shift+P-> “CMake: Debug”,或点击状态栏的“Debug”按钮。这会在launch.json中自动生成调试配置。
- 构建:
- 切换构建类型:默认可能是
Debug(包含调试信息,优化等级低)。你可以切换到Release(无调试信息,优化等级高)以获得最佳性能。通过命令面板“CMake: Select Variant”或点击状态栏的构建类型进行切换。 - 清理构建:
Ctrl+Shift+P-> “CMake: Clean” 可以清理所有构建产物,CMake: Clean Rebuild会先清理再构建。
5.3 调试配置实战
调试是C++开发中不可或缺的一环。CMake Tools会自动生成调试配置,但了解其原理很重要。查看项目.vscode/launch.json文件,你会看到类似这样的配置:
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", // 配置名称 "type": "cppdbg", // 调试器类型 "request": "launch", // 启动调试 "program": "${command:cmake.launchTargetPath}", // 程序路径,由CMake Tools自动填充 "args": [], // 命令行参数 "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", // 使用GDB调试器 "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "CMake: build" // 调试前先执行构建任务 } ] }program:这是最关键的一项,${command:cmake.launchTargetPath}这个变量会由CMake Tools自动替换为当前选中目标(如test_app)的可执行文件路径。args:你可以在这里设置程序启动时的命令行参数,例如你的推理程序可能需要指定模型路径“args”: [“–model”, “resnet50.onnx”]。preLaunchTask:设置为”CMake: build”后,每次启动调试前都会自动执行一次构建,确保调试的是最新代码。
设置断点,然后按F5启动调试,你就可以像在IDE中一样单步执行、查看变量、观察调用栈了。
6. 常见问题与深度排查指南
即使按照步骤操作,你也可能会遇到一些“坑”。这里汇总了从环境搭建到项目构建中最常见的问题及其解决方案。
6.1 编译与链接错误大全
问题1:fatal error: NvInfer.h: No such file or directory
- 原因:编译器找不到TensorRT的头文件。
- 排查:
- 检查
find_package(TensorRT)是否成功。查看CMake配置输出,确认TensorRT_INCLUDE_DIRS路径是否正确。 - 检查
c_cpp_properties.json中的includePath是否包含了TensorRT的include目录。 - 在终端中手动验证路径是否存在:
ls /usr/local/tensorrt/include/NvInfer.h。
- 检查
- 解决:确保
TensorRT_DIR变量正确指向了包含TensorRTConfig.cmake的目录(通常是<TensorRT安装目录>/lib/cmake/tensorrt)。
**问题2:undefined reference tonvinfer1::createInferBuilder(...)**
- 原因:链接器找不到TensorRT的库文件。这是最常见的链接错误。
- 排查:
- 检查
find_package(TensorRT)输出,确认TensorRT_LIBRARIES变量是否包含nvinfer等库。 - 检查
target_link_libraries命令是否正确添加了${TensorRT_LIBRARIES}。 - 运行
ldd ./build/bin/test_app,查看可执行文件依赖的libnvinfer.so是否显示not found。
- 检查
- 解决:
- 确保链接命令正确。
- 检查运行时库路径:将TensorRT的lib目录(如
/usr/local/tensorrt/lib)添加到LD_LIBRARY_PATH环境变量中,并source ~/.bashrc使其生效。 - 对于编译链接,CMake的
find_package通常能处理好。如果不行,可以尝试手动指定:target_link_libraries(test_app PRIVATE nvinfer)。
问题3:CMake Error: CMake_C_COMPILER not set, after EnableLanguage
- 原因:CMake找不到C编译器。虽然我们主要用C++,但CMake配置时需要C编译器。
- 解决:安装
gcc(C编译器):sudo apt install gcc。g++通常会作为依赖被安装,但有时基础系统可能缺少独立的gcc包。
问题4:error while loading shared libraries: libxxx.so.8: cannot open shared object file
- 原因:程序运行时,动态链接器找不到所需的共享库(.so文件)。
- 解决:
- 永久方案:将库所在目录(如
/usr/local/tensorrt/lib)加入/etc/ld.so.conf文件,或在该目录下创建一个.conf文件,然后运行sudo ldconfig刷新缓存。 - 临时方案:在运行程序前设置环境变量
export LD_LIBRARY_PATH=/usr/local/tensorrt/lib:$LD_LIBRARY_PATH。 - 打包方案:对于发布,可以考虑静态链接,或在发布时携带这些so库,并通过脚本设置
LD_LIBRARY_PATH。
- 永久方案:将库所在目录(如
6.2 VS Code特定问题
问题5:VS Code的IntelliSense依然报红,但CMake能正常编译
- 原因:C/C++扩展的IntelliSense数据库没有及时更新,或者配置有冲突。
- 解决:
- 按
Ctrl+Shift+P,运行“C/C++: Reset IntelliSense Database”。 - 检查
.vscode/c_cpp_properties.json,确保configurationProvider设置为”ms-vscode.cmake-tools”,并移除可能与CMake生成信息冲突的手动includePath条目。 - 运行“CMake: Delete Cache and Reconfigure”来刷新CMake的缓存和生成信息。
- 按
问题6:在WSL中,VS Code无法打开终端或终端无响应
- 原因:WSL实例可能处于休眠状态,或者VS Code的远程服务器出现问题。
- 解决:
- 关闭所有VS Code窗口。
- 在Windows PowerShell中运行
wsl --shutdown来关闭所有WSL发行版。 - 重新打开VS Code并连接WSL。
6.3 项目结构与构建最佳实践
当项目逐渐变大,单一CMakeLists.txt会变得难以维护。以下是一些进阶实践:
模块化CMake:将不同功能的代码放到不同的子目录中,每个子目录有自己的
CMakeLists.txt,根目录的CMakeLists.txt使用add_subdirectory()来包含它们。例如:project_root/ ├── CMakeLists.txt ├── app/ │ ├── CMakeLists.txt │ └── main.cpp ├── utils/ │ ├── CMakeLists.txt │ └── logger.cpp └── models/ ├── CMakeLists.txt └── resnet.cpp使用
target_include_directories替代include_directories:现代CMake推荐将头文件路径关联到具体的目标(target),而不是全局设置。这能更好地管理依赖关系,避免污染。区分
PRIVATE、PUBLIC、INTERFACE:在target_include_directories和target_link_libraries中正确使用这些关键字。PRIVATE:依赖项仅用于实现当前目标,不传递给链接它的其他目标。PUBLIC:依赖项既用于实现当前目标,也传递给链接它的其他目标。INTERFACE:依赖项不用于实现当前目标,但传递给链接它的其他目标(常用于头文件库)。
利用
CMakePresets.json管理多配置:如果你需要在Debug/Release、不同CUDA版本、不同平台之间切换,手动修改CMakeLists.txt或命令行参数很麻烦。CMakePresets.json可以定义一组预设的配置(缓存变量、环境变量等),在VS Code中一键切换。
环境搭建本身不是目的,而是一个让你能专注于核心算法和性能优化的坚实起点。当你熟练掌握了这套基于g++、CMake和VS Code的工具链,并将其与TensorRT的强大能力结合,你就具备了将最前沿的深度学习模型部署到任何C++可及之处的核心能力。从今天起,试着用这套环境去编译、运行TensorRT官方提供的C++示例(如sampleMNIST),你将开启一段全新的高性能推理之旅。
