CMake链接OpenCV(补档)

使用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文件查找两个变量。