661 字
3 分钟
CMake 链接 OpenCV(2)
2024-02-13
2025-07-31

使用CMake链接OpenCV实际上不需要直接指定绝对路径,本文主要是记录OpenCV更合理的配置。

CMakelists如何编写#

相信大家在网上查找如何使用CMake配置好OpenCV都会看见以下代码。

find_package(OpenCV REQUIRED)
add_executable(opencv-project main.cpp)
target_include_directories(opencv-project PRIVATE ${OpenCV_INCLUDE_DIRS})
target_link_libraries(opencv-project ${OpenCV_LIBS})
message(STATUS "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV_LIBS = ${OpenCV_LIBS}")

这些代码十分神奇🤔,因为这里好像根本不需要指定路径就能调用OpenCV库,但是我们发现,整个CMake除了message是用来终端打印信息,其他的代码仿佛也都是在指定链接的库lib在哪、头文件include在哪,可是却没有一个路径。

为什么CMake能找到OpenCV?#

关于find_package#

实际上,这条语句会寻找一个文件OpenCVConfig.cmake,这也是为什么find_package内必须写的是OpenCV,而不能是opencv、Opencv。这是因为官方提供的opencv包中,build文件夹下提供是的OpenCVConfig.cmake,所以大小写必须按照该文件名来。同时,该语句会在系统环境变量中寻找”opencv/build”这样一个文件夹,所以实际上要链接openCV,CMake是通过系统环境变量找到这个文件夹,再通过OpenCVConfig.cmake提供相对路径找到其他文件夹。

关于OpenCV_LIBSOpenCV_INCLUDE_DIRS#

CMake中,&{}内实际上是一个变量,也就是说OpenCV_LIBSOpenCV_INCLUDE_DIRS应该是存储了静态库 lib 和头文件地址的变量,这可以在message中打印出来(执行cmake ..时可以在终端看见),而这两个变量由find_package找到系统环境变量中的”opencv/build”内各OpenCVConfig.cmake提供,这里可以通过打开相关.cmake文件查找两个变量。

关于路径#

TIP

实际上, 不一定非要绝对路径, CMake 自己有变量来控制路径

# 项目相关路径
${CMAKE_SOURCE_DIR} # 项目根目录 (最顶层CMakeLists.txt所在目录)
${CMAKE_BINARY_DIR} # 构建目录 (执行cmake命令的目录)
${CMAKE_CURRENT_SOURCE_DIR} # 当前CMakeLists.txt所在目录
${CMAKE_CURRENT_BINARY_DIR} # 当前目标的构建目录
# 项目信息
${PROJECT_SOURCE_DIR} # 当前项目根目录
${PROJECT_BINARY_DIR} # 当前项目构建目录
${PROJECT_NAME} # 项目名称
# 系统相关路径
${CMAKE_INSTALL_PREFIX} # 安装路径前缀 (默认 /usr/local)
${CMAKE_PREFIX_PATH} # 查找包的路径前缀
# 编译器相关
${CMAKE_C_COMPILER} # C编译器路径
${CMAKE_CXX_COMPILER} # C++编译器路径
${CMAKE_BUILD_TYPE} # 构建类型 (Debug/Release/RelWithDebInfo/MinSizeRel)
# 库和可执行文件输出路径
${CMAKE_RUNTIME_OUTPUT_DIRECTORY} # 可执行文件输出目录
${CMAKE_LIBRARY_OUTPUT_DIRECTORY} # 动态库输出目录
${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} # 静态库输出目录
# 平台检测
${CMAKE_SYSTEM_NAME} # 操作系统名称 (Linux/Windows/Darwin等)
${CMAKE_SYSTEM_PROCESSOR} # 处理器架构 (x86_64/arm64等)
# 常用示例
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
CMake 链接 OpenCV(2)
https://laplace825.github.io/posts/cmake/cmake2/
作者
Laplace
发布于
2024-02-13
许可协议
CC BY-NC-SA 4.0