在Linux环境下开发智能视频监控应用程序,通常涉及视频采集、编解码、目标检测与报警等多个模块,依赖OpenCV、推理框架及系统库。使用CMake可以统一描述这些依赖与编译规则,降低跨机器构建的复杂度。

项目目录与基本结构
建议将不同功能放在独立目录中,并在根目录提供统一的CMakeLists.txt。这样既能明确模块边界,也方便后续开启独立编译选项。
cmake_minimum_required(VERSION 3.10) project(SmartSurveillance VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 开启编译警告 add_compile_options(-Wall -Wextra) add_subdirectory(capture) add_subdirectory(inference) add_subdirectory(alert)
查找并链接核心依赖
智能监控程序常依赖OpenCV处理图像,以及如TensorRT或ONNX Runtime做推理。可以在各子模块用find_package定位。
find_package(OpenCV REQUIRED)
find_package(Threads REQUIRED)
add_library(capture capture/video_capture.cpp)
target_include_directories(capture PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries(capture ${OpenCV_LIBS} Threads::Threads)
推理模块的依赖配置
如果推理库未提供CMake配置文件,可用find_library直接定位.so文件。
find_library(ONNXRUNTIME_LIB onnxruntime HINTS /opt/onnxrt/lib)
target_link_libraries(inference ${ONNXRUNTIME_LIB} ${OpenCV_LIBS})
构建类型与多线程优化
通过CMAKE_BUILD_TYPE控制调试或发布,并使用并行编译缩短时间。可在配置时传入参数。
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_JOB_POOLS:STRING=compile=4 .. cmake --build . --parallel 4
条件编译与交叉编译支持
当目标设备为ARM板卡时,可编写toolchain文件并切换编译器。用选项控制是否编译模拟模块。
option(BUILD_SIMULATOR "Build local simulator" OFF)
if(BUILD_SIMULATOR)
add_executable(sim main_sim.cpp)
endif()
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
常用配置技巧总结
- 用target_include_directories取代全局include,避免污染
- 将第三方库路径通过CACHE变量暴露,方便CI修改
- 对视频与推理模块分别开启-fopenmp提升吞吐
- 使用STATUS消息打印关键配置,便于排查
通过上述方式,CMake能稳定支撑Linux智能视频监控应用的持续构建与多端部署。