# 最低CMake版本要求:3.21 以上才支持 RUNTIME_DEPENDENCIES install 功能(自动部署 vcpkg so) cmake_minimum_required(VERSION 3.21) # ===================================================== # Toolchain (vcpkg) # ===================================================== # 告诉CMake使用vcpkg作为依赖管理 # 所有 find_package(... CONFIG) 会优先搜索 vcpkg 提供的库 set(CMAKE_TOOLCHAIN_FILE $ENV{HOME}/vcpkg/scripts/buildsystems/vcpkg.cmake CACHE STRING "Vcpkg toolchain file") # ===================================================== # Project定义 # ===================================================== project(sentinel-app LANGUAGES CXX) # ===================================================== # 全局构建配置 # ===================================================== # 使用C++17标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 对生成的库启用位置无关代码(PIE / PIC) set(CMAKE_POSITION_INDEPENDENT_CODE ON) # ===================================================== # 平台检测 执行命令获取目标机器架构 # ===================================================== execute_process( COMMAND gcc -dumpmachine OUTPUT_VARIABLE TARGET_DEVICE OUTPUT_STRIP_TRAILING_WHITESPACE ) # 如果是 aarch64 (Jetson / Tegra),定义宏 PLATFORM_TEGRA if(TARGET_DEVICE MATCHES "aarch64") add_compile_definitions(PLATFORM_TEGRA) endif() # ===================================================== # 依赖库 # ===================================================== # pkg-config 必须,用来查询系统库的编译/链接参数 find_package(PkgConfig REQUIRED) # vcpkg 管理的库(现代CMake target) find_package(miniocpp CONFIG REQUIRED) # minio C++ SDK find_package(yaml-cpp CONFIG REQUIRED) # yaml parser # ======================== # 系统库 / NVIDIA stack # ======================== pkg_check_modules(GST REQUIRED gstreamer-1.0) # gstreamer 头文件与库 pkg_check_modules(UUID REQUIRED uuid) # uuid 库 # ===================================================== # 主可执行文件 # ===================================================== add_executable(sentinel-app src/app.cpp src/service/vehicle_event_service.cpp src/service/rtsp_grabber.cpp src/utils/ds_yml_parse.cpp src/utils/my_utils.cpp ) # 编译选项 target_compile_options(sentinel-app PRIVATE -Wall # 打开所有警告 -Werror # 警告当作错误 -Wno-unused-function # 忽略未使用函数警告 ) # 包含目录 target_include_directories(sentinel-app PRIVATE src # 自己的源码目录 src/service src/utils ${GST_INCLUDE_DIRS} # gstreamer include /opt/nvidia/deepstream/deepstream/sources/includes # DeepStream SDK /usr/local/cuda/include # CUDA ) # 链接目录(仅针对非 target 方式库) target_link_directories(sentinel-app PRIVATE /opt/nvidia/deepstream/deepstream/lib # DeepStream 库 /usr/local/cuda/lib64 # CUDA 库 ) # 链接库 target_link_libraries(sentinel-app PRIVATE # vcpkg target,现代CMake可追踪 miniocpp::miniocpp yaml-cpp # RabbitMQ SimpleAmqpClient rabbitmq # 系统/DeepStream/GStreamer库 ${GST_LIBRARIES} gstrtspserver-1.0 nvds_batch_jpegenc nvdsgst_meta nvdsgst_helper nvds_meta nvds_yml_parser # 系统/第三方库 uuid cudart avformat avcodec avutil swscale avdevice avfilter curl m z pthread ) # ===================================================== # RPATH 设置(运行时库搜索路径) # ===================================================== # BUILD_RPATH:构建时运行可执行文件的搜索路径 # INSTALL_RPATH:安装后运行可执行文件的搜索路径 # $ORIGIN 表示可执行文件所在目录 set_target_properties(sentinel-app PROPERTIES BUILD_RPATH "\$ORIGIN/lib" # 优先搜索 dist/lib INSTALL_RPATH "\$ORIGIN/lib:/opt/nvidia/deepstream/deepstream/lib" # fallback DeepStream ) # ===================================================== # 安装规则(部署阶段) # ===================================================== # 安装可执行文件,并自动收集 vcpkg 的运行时 so install(TARGETS sentinel-app RUNTIME_DEPENDENCIES PRE_EXCLUDE_REGEXES "ld-linux" # 排除系统 loader "libc.so" # 系统 libc "libm.so" # 系统 math "libpthread.so" # 系统线程库 "libdl.so" # 系统动态库 "libcuda" # CUDA 系统库 "libnvidia" # NVIDIA 驱动 "libnv" # NVIDIA 系统库 "libgst" # GStreamer 系统库 "libav" # ffmpeg 系统库 "libcrypto" # 系统加密库 "libssl" POST_EXCLUDE_REGEXES ".*/opt/nvidia/.*" # 不拷贝 DeepStream 系统库 ".*/usr/lib/.*" # 不拷贝系统库 RUNTIME DESTINATION . # 可执行文件放 dist/ LIBRARY DESTINATION lib # 对应 so 库安装到 dist/lib/ )