1- # 设置项目
2- cmake_minimum_required (VERSION 3.12)
3- cmake_policy (SET CMP0091 NEW)
4- project (TensorRT-YOLO VERSION 6.0.0 LANGUAGES CXX CUDA)
1+ cmake_minimum_required (VERSION 3.17)
2+ cmake_policy (SET CMP0091 NEW) # 确保 MSVC 运行时库策略正确
3+
4+ #-------------------------------------------------------------------------------
5+ # 项目基础配置
6+ #-------------------------------------------------------------------------------
7+ project (TensorRT-YOLO
8+ VERSION 6.1.0
9+ LANGUAGES CXX CUDA
10+ DESCRIPTION "🚀 Easier & Faster YOLO Deployment Toolkit for NVIDIA 🛠️"
11+ )
12+
13+ # 生成编译数据库(供clangd等工具使用)
14+ set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
515
616# 设置 C++ 标准
717set (CMAKE_CXX_STANDARD 17)
818set (CMAKE_CXX_STANDARD_REQUIRED ON )
19+ set (CMAKE_CXX_EXTENSIONS OFF )
920
10- # 生成编译数据库,便于代码分析工具使用
11- set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
21+ #-------------------------------------------------------------------------------
22+ # 依赖配置
23+ #-------------------------------------------------------------------------------
24+ # CUDA 配置
25+ find_package (CUDAToolkit REQUIRED)
1226
13- # 添加依赖项
14- if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.18)
15- find_package (CUDAToolkit REQUIRED)
16- set (CUDA_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIRS} )
17- set (CUDA_LIBRARIES ${CUDAToolkit_LIBRARIES} )
18- else ()
19- find_package (CUDA REQUIRED)
27+ # 允许用户覆盖默认的 CUDA 架构
28+ if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
29+ set (CMAKE_CUDA_ARCHITECTURES "89;86;75;70;61" ) # 默认支持架构
2030endif ()
21- set (CMAKE_CUDA_ARCHITECTURES 89;86;75;70;61) # CUDA 架构版本 8.9, 8.6, 7.5, 7.0, 6.1
2231
23- # 添加编译选项
24- option (TENSORRT_PATH "TensorRT Path. Example: /usr/local/tensorrt" " " )
25- if (NOT TENSORRT_PATH )
26- message (FATAL_ERROR "TensorRT path is not set. Please specify the TensorRT path. " )
32+ # TensorRT 路径配置
33+ set (TRT_PATH "" CACHE PATH " Path to TensorRT installation (e.g., /usr/local/tensorrt) " )
34+ if (NOT TRT_PATH )
35+ message (FATAL_ERROR "TensorRT path must be specified with -DTRT_PATH=/ path/to/tensorrt " )
2736endif ()
2837
29- # 添加选项:是否编译Python版本
30- option (BUILD_PYTHON "Build Python bindings" OFF )
31- if (BUILD_PYTHON)
32- message (STATUS "Python bindings will be built." )
38+ # 定义 TensorRT 库的版本选择
39+ set (TRT_LIB_DIR "${TRT_PATH} /lib" )
40+ if (MSVC AND EXISTS "${TRT_LIB_DIR} /nvinfer_10.dll" )
41+ set (TRT_LIBS nvinfer_10 nvinfer_plugin_10 nvonnxparser_10)
42+ else ()
43+ set (TRT_LIBS nvinfer nvinfer_plugin nvonnxparser)
44+ endif ()
3345
34- # Pybind11 依赖
46+ # Python 绑定选项
47+ option (BUILD_PYTHON "Build Python bindings with pybind11" OFF )
48+ if (BUILD_PYTHON)
3549 set (PYBIND11_FINDPYTHON ON )
3650 find_package (Python COMPONENTS Interpreter Development REQUIRED)
3751 find_package (pybind11 CONFIG REQUIRED)
38- else ()
39- message (STATUS "Python bindings will NOT be built." )
4052endif ()
4153
42- # 配置CUDA和TensorRT的函数
43- function (configure_cuda_trt target )
44- target_compile_definitions (${target} PRIVATE ${CUDA_DEFINITIONS} )
45- target_include_directories (${target} PRIVATE ${CUDA_INCLUDE_DIRS} )
46- target_link_libraries (${target} PRIVATE ${CUDA_cudart_LIBRARY} )
54+ #-------------------------------------------------------------------------------
55+ # 编译工具链配置
56+ #-------------------------------------------------------------------------------
57+ function (set_target_compile_options target )
58+ # MSVC 配置
59+ if (MSVC )
60+ # C++编译选项
61+ target_compile_options (${target} PRIVATE
62+ $<$<AND :$<CONFIG:Release>,$<COMPILE_LANGUAGE:CXX>>:/O2 /Oi /fp:fast>
63+ $<$<AND :$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CXX>>:/Od /Ob0 /Zi /RTC1>
64+ )
65+
66+ # CUDA编译选项
67+ target_compile_options (${target} PRIVATE
68+ $<$<AND :$<CONFIG:Release>,$<COMPILE_LANGUAGE:CUDA>>:-Xcompiler=/O2 -O3>
69+ $<$<AND :$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CUDA>>:-Xcompiler=/Od -g -G>
70+ )
4771
48- target_include_directories (${target} PRIVATE ${TENSORRT_PATH} /include )
49- target_link_directories (${target} PRIVATE ${TENSORRT_PATH} /lib)
50- if (MSVC AND EXISTS ${TENSORRT_PATH} /lib/nvinfer_10.dll)
51- target_link_libraries (${target} PRIVATE nvinfer_10 nvinfer_plugin_10 nvonnxparser_10)
72+ set_target_properties (${target} PROPERTIES MSVC_RUNTIME_LIBRARY
73+ "$<$<CONFIG:Debug>:MultiThreadedDebugDLL>$<$<CONFIG:Release>:MultiThreadedDLL>"
74+ )
75+
76+ # GCC/Clang 配置
5277 else ()
53- target_link_libraries (${target} PRIVATE nvinfer nvinfer_plugin nvonnxparser)
78+ # C++编译选项
79+ target_compile_options (${target} PRIVATE
80+ $<$<AND :$<CONFIG:Release>,$<COMPILE_LANGUAGE:CXX>>:-O3 -march=native -flto=auto -DNDEBUG>
81+ $<$<AND :$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CXX>>:-O0 -g3 -fno-omit-frame-pointer -fno-inline>
82+ )
83+
84+ # CUDA编译选项
85+ target_compile_options (${target} PRIVATE
86+ $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-deprecated-declarations>
87+ $<$<AND :$<CONFIG:Release>,$<COMPILE_LANGUAGE:CUDA>>:-O3>
88+ $<$<AND :$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CUDA>>:-g -G>
89+ )
90+
91+ target_link_options (${target} PRIVATE
92+ $<$<AND :$<CONFIG:Release>,$<COMPILE_LANGUAGE:CXX>>:-O3 -flto=auto>
93+ $<$<AND :$<CONFIG:Debug>,$<COMPILE_LANGUAGE:CXX>>:-g3>
94+ )
5495 endif ()
55- endfunction ()
5696
57- # 添加源文件的函数
58- function (add_compile_files target )
59- include_directories (${PROJECT_SOURCE_DIR} )
60- file (GLOB_RECURSE SOURCES
61- ${PROJECT_SOURCE_DIR} /deploy/core/*.cpp
62- ${PROJECT_SOURCE_DIR} /deploy/utils/*.cpp
63- ${PROJECT_SOURCE_DIR} /deploy/infer/*.cpp
64- ${PROJECT_SOURCE_DIR} /deploy/infer/*.cu
65- ${PROJECT_SOURCE_DIR} /deploy/model.cpp
97+ # 跨平台宏定义
98+ target_compile_definitions (${target} PRIVATE
99+ $<$<CONFIG:Debug>:DEBUG>
100+ $<$<NOT :$<CONFIG:Debug>>:NDEBUG>
66101 )
67- target_sources (${target} PRIVATE ${SOURCES} )
68102endfunction ()
69103
70- # 设置编译选项的函数
71- function (set_compile_options target )
72- if (MSVC )
73- target_compile_options (${target} PRIVATE $<$<CONFIG:Release>:-O2>)
74- set_property (TARGET ${target} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" )
75- else ()
76- target_compile_options (${target} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-O3 -flto=auto>)
77- target_link_options (${target} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-O3 -flto=auto>)
78- endif ()
79- endfunction ()
104+ #-------------------------------------------------------------------------------
105+ # TensorRT/CUDA 目标配置
106+ #-------------------------------------------------------------------------------
107+ function (configure_cuda_trt_target target )
108+ # 包含目录
109+ target_include_directories (${target} PRIVATE
110+ ${TRT_PATH} /include
111+ )
80112
81- # 添加子目录
82- add_subdirectory (${PROJECT_SOURCE_DIR} /plugin)
113+ # 链接目录
114+ target_link_directories (${target} PRIVATE
115+ ${TRT_LIB_DIR}
116+ )
83117
84- # 定义目标 deploy
85- add_library (deploy SHARED)
86- add_compile_files(deploy)
87- configure_cuda_trt(deploy)
88- set_compile_options(deploy)
89- set_target_properties (deploy PROPERTIES OUTPUT_NAME deploy)
90-
91- if (MSVC )
92- set_target_properties (deploy PROPERTIES
93- RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR} /lib
94- ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR} /lib
95- RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR} /lib
96- ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR} /lib
118+ # 添加链接库
119+ target_link_libraries (${target} PRIVATE
120+ CUDA::cudart
121+ ${TRT_LIBS}
122+ )
123+
124+ # CUDA 特性
125+ set_target_properties (${target} PROPERTIES
126+ CUDA_SEPARABLE_COMPILATION ON
127+ CUDA_RESOLVE_DEVICE_SYMBOLS ON
128+ )
129+ endfunction ()
130+
131+ #-------------------------------------------------------------------------------
132+ # 收集源文件(使用 CONFIGURE_DEPENDS 自动更新)
133+ #-------------------------------------------------------------------------------
134+ function (add_target_compile_files target )
135+ # 添加项目源码目录到目标的私有包含目录
136+ target_include_directories (${target} PRIVATE ${PROJECT_SOURCE_DIR} )
137+
138+ # 收集源文件
139+ file (GLOB_RECURSE SOURCES CONFIGURE_DEPENDS
140+ "${PROJECT_SOURCE_DIR} /deploy/core/*.cpp"
141+ "${PROJECT_SOURCE_DIR} /deploy/utils/*.cpp"
142+ "${PROJECT_SOURCE_DIR} /deploy/infer/*.cpp"
143+ "${PROJECT_SOURCE_DIR} /deploy/infer/*.cu"
144+ "${PROJECT_SOURCE_DIR} /deploy/model.cpp"
97145 )
98- else ()
99- set_target_properties (deploy PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR} /lib)
100- endif ()
101146
102- # 定义目标 pydeploy(仅在BUILD_PYTHON为ON时编译)
147+ # 将收集到的源文件添加到目标
148+ target_sources (${target} PRIVATE ${SOURCES} )
149+ endfunction ()
150+
151+ #-------------------------------------------------------------------------------
152+ # 主库目标
153+ #-------------------------------------------------------------------------------
154+ # 创建主库
155+ add_library (deploy SHARED)
156+ add_target_compile_files(deploy)
157+ configure_cuda_trt_target(deploy)
158+ set_target_compile_options(deploy)
159+
160+ # 模块配置
161+ set_target_properties (deploy PROPERTIES
162+ OUTPUT_NAME "deploy"
163+ LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR} /lib"
164+ ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR} /lib"
165+ RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR} /lib"
166+ LIBRARY_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR} /lib"
167+ ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR} /lib"
168+ RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR} /lib"
169+ LIBRARY_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR} /lib"
170+ ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR} /lib"
171+ CXX_VISIBILITY_PRESET "hidden"
172+ )
173+
174+ #-------------------------------------------------------------------------------
175+ # Python 绑定(可选)
176+ #-------------------------------------------------------------------------------
103177if (BUILD_PYTHON)
104178 pybind11_add_module(pydeploy ${PROJECT_SOURCE_DIR} /deploy/pybind.cpp)
105- add_compile_files(pydeploy)
106- configure_cuda_trt(pydeploy)
107- set_compile_options(pydeploy)
108- set_target_properties (pydeploy PROPERTIES OUTPUT_NAME pydeploy)
109-
110- if (MSVC )
111- set_target_properties (pydeploy PROPERTIES
112- LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/libs
113- LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/libs
114- )
115- else ()
116- set_target_properties (pydeploy PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/libs)
117- endif ()
179+ add_target_compile_files(pydeploy)
180+ configure_cuda_trt_target(pydeploy)
181+ set_target_compile_options(pydeploy)
118182
183+ # Python 模块配置
119184 set_target_properties (pydeploy PROPERTIES
120- COMPILE_DEFINITIONS "CUDA_PATH=\" ${CUDA_TOOLKIT_ROOT_DIR} \" "
121- COMPILE_DEFINITIONS "TENSORRT_PATH=\" ${TENSORRT_PATH} \" "
185+ OUTPUT_NAME "pydeploy"
186+ LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/libs"
187+ LIBRARY_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/libs"
188+ LIBRARY_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/libs"
189+ CXX_VISIBILITY_PRESET "hidden"
122190 )
123191
124- # 配置文件
192+ # Python 配置文件
125193 configure_file (
126194 ${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/c_lib_wrap.py.in
127195 ${PROJECT_SOURCE_DIR} /python/tensorrt_yolo/c_lib_wrap.py
128196 )
129- endif ()
197+ endif ()
198+
199+ #-------------------------------------------------------------------------------
200+ # 子项目
201+ #-------------------------------------------------------------------------------
202+ add_subdirectory (plugin)
0 commit comments