-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
147 lines (129 loc) · 5.24 KB
/
Copy pathCMakeLists.txt
File metadata and controls
147 lines (129 loc) · 5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# =============================================================================
# 1. 项目基本配置
# =============================================================================
cmake_minimum_required(VERSION 3.18)
project(TRTSam LANGUAGES CXX CUDA)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_ARCHITECTURES 80 86 89)
set(CMAKE_LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/workspace)
set(CMAKE_RUNTIME_OUTPUT_PATH ${CMAKE_BINARY_DIR}/workspace)
# =============================================================================
# 2. 查找依赖项
# =============================================================================
# 智能查找通过pip安装的pybind11
execute_process(
COMMAND python3 -m pybind11 --cmakedir
OUTPUT_VARIABLE pybind11_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE pybind11_FOUND_RESULT
)
if(pybind11_FOUND_RESULT EQUAL 0)
find_package(pybind11 REQUIRED HINTS ${pybind11_DIR})
message(STATUS "Found pybind11: ${pybind11_VERSION} (at ${pybind11_DIR})")
else()
message(WARNING "Could not auto-find pybind11. Falling back to standard search.")
find_package(pybind11 REQUIRED)
endif()
# 手动查找TensorRT组件
find_path(TENSORRT_INCLUDE_DIRS NvInfer.h
HINTS ${TENSORRT_ROOT}/include /usr/include/x86_64-linux-gnu /usr/include
REQUIRED
)
# 使用 HINTS 来指导 find_library 在你指定的路径下查找
find_library(NVINFER_LIBRARY nvinfer
HINTS ${TENSORRT_ROOT}/lib ${TENSORRT_ROOT}/targets/x86_64-linux-gnu/lib /usr/lib/x86_64-linux-gnu/
REQUIRED
)
find_library(NVINFER_PLUGIN_LIBRARY nvinfer_plugin
HINTS ${TENSORRT_ROOT}/lib ${TENSORRT_ROOT}/targets/x86_64-linux-gnu/lib /usr/lib/x86_64-linux-gnu/
REQUIRED
)
find_library(NVONNXPARSER_LIBRARY nvonnxparser
HINTS ${TENSORRT_ROOT}/lib ${TENSORRT_ROOT}/targets/x86_64-linux-gnu/lib /usr/lib/x86_64-linux-gnu/
REQUIRED
)
set(TENSORRT_LIBRARIES ${NVINFER_LIBRARY} ${NVINFER_PLUGIN_LIBRARY} ${NVONNXPARSER_LIBRARY})
message(STATUS "Found TensorRT Include Path: ${TENSORRT_INCLUDE_DIRS}")
message(STATUS "Found nvinfer library: ${NVINFER_LIBRARY}")
message(STATUS "Found nvinfer_plugin library: ${NVINFER_PLUGIN_LIBRARY}")
message(STATUS "Found nvonnxparser library: ${NVONNXPARSER_LIBRARY}")
# 查找其他依赖
find_package(OpenCV 4 REQUIRED COMPONENTS core imgproc videoio imgcodecs)
find_package(CUDAToolkit REQUIRED)
find_package(Python3 COMPONENTS Development REQUIRED)
find_package(Freetype REQUIRED)
find_package(OpenMP REQUIRED)
# =============================================================================
# 3. 收集源文件 (最佳实践:明确列出所有文件)
# =============================================================================
# A. 核心库的源文件
set(CORE_SOURCES
src/common/createObject.cpp
src/common/image.cpp
src/common/memory.cu
src/common/norm.cpp
src/common/object.cpp
src/common/tensorrt.cpp
src/infer/infer.cpp
src/infer/sam3infer.cpp
src/kernels/postprocess.cu
src/kernels/preprocess.cu
src/kernels/process_kernel_warp.cu
src/osd/cvx_text.cpp
src/osd/osd.cpp
)
# B. Python绑定的源文件
set(INTERFACE_SOURCES
src/interface.cpp
)
# C. C++可执行文件的源文件
set(EXECUTABLE_SOURCES
src/main.cpp
)
# =============================================================================
# 4. 定义构建目标
# =============================================================================
# A. 定义核心静态库 (包含所有共享逻辑)
add_library(trtsam_core STATIC ${CORE_SOURCES})
# B. 定义Python模块 (由interface.cpp创建)
pybind11_add_module(trtsam3 SHARED ${INTERFACE_SOURCES})
# C. 定义纯C++可执行文件 (由main.cpp创建)
add_executable(pro ${EXECUTABLE_SOURCES})
# =============================================================================
# 5. 设置目标属性 (链接)
# =============================================================================
# --- A. 为核心库 trtsam_core 配置所有外部依赖 ---
# 使用PUBLIC,这样链接它的目标会自动继承这些属性
target_include_directories(trtsam_core PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
${OpenCV_INCLUDE_DIRS}
${TENSORRT_INCLUDE_DIRS}
${CUDAToolkit_INCLUDE_DIRS}
${FREETYPE_INCLUDE_DIRS}
)
target_link_libraries(trtsam_core PUBLIC
${OpenCV_LIBS}
${TENSORRT_LIBRARIES}
cudart cublas cudnn
Freetype::Freetype
OpenMP::OpenMP_CXX
"dl"
)
target_compile_options(trtsam_core PUBLIC -O2 -w -fPIC)
# --- B. 为最终目标链接核心库 ---
# Python模块 和 C++可执行文件 都依赖于核心库
target_link_libraries(trtsam3 PRIVATE trtsam_core)
target_link_libraries(pro PRIVATE trtsam_core)
# --- C. 为最终产物设置RPATH ---
set_target_properties(trtsam3 pro PROPERTIES
INSTALL_RPATH "$ORIGIN"
BUILD_WITH_INSTALL_RPATH TRUE
)
# =============================================================================
# 6. 添加自定义命令
# =============================================================================
add_custom_target(run COMMAND python3 demo.py WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_PATH} DEPENDS trtsam3)
add_custom_target(runpro COMMAND ./pro WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_PATH} DEPENDS pro)