2.正文
2.1 模板
#cmake 版本检查
cmake_minimum_required (VERSION 2.8)
#项目名字
project (greenReplace)
#设置c++版本
set(CMAKE_CXX_STANDARD 17)
set(OpenCV_DIR /root/download/opencv-master/build/)
#开启debug
set(CMAKE_BUILD_TYPE "Debug")
#release
#SET(CMAKE_BUILD_TYPE "Release")
#寻找openCV
find_package( OpenCV REQUIRED ) //通过OpenCV.cmake完成
#设置头文件路径 -I
include_directories("/usr/include")
include_directories( ${OpenCV_INCLUDE_DIRS} )
include_directories("/usr/local/include/opencv4")
#设置要动态连接库的目录
link_directories("/usr/lib")
#将当前目录下所有.c cpp .h .hpp 文件放入 SRC变量中
aux_source_directory(. SOURCES_FILES)
#将所有源文件编译成greenReplace
add_executable(greenReplace ${SOURCES_FILES})
#链接
target_link_libraries(greenReplace ${OpenCV_LIBS})
2.2 target_link_libraries的细节
target_link_libraries是用来把一个tager做链接库的,如下使用:
target_link_libraries(test libwebsockets.so libjansson.so)
和下面的方式等效
target_link_libraries(test -lwebsockets -ljansson)
注意: 链接pthread的时候,应该直接使用 pthread(g++/gcc 对于该选项除了link 会添加一些宏)而不是-lpthread
//等效于-ptherad
target_link_libraries(test pthread)
2.3 find_package的细节
通过调用find_package可以找到头文件和所需要的库文件或者是一个CMake打包配置文件
find_package(OpenCV
[version] [EXACT] # 可选项,最小版本或者确切所需版本
[REQUIRED] # 可选项,如果找不到所需库,报错
[COMPONENTS <libs>...] # 所需的库名称,比如说. "date_time" 代表 "libboost_date_time"
)
运行完后可以得到很多变量,下面列了一些主要的
OpenCV_FOUND - 如果找到了所需的库就设为true
OpenCV_INCLUDE_DIRS - OpenCV头文件搜索路径
OpenCV_LIBRARY_DIRS - OpenCV库的链接路径
OpenCV_LIBRARIES - OpenCV库名,用于链接到目标程序
OpenCV_VERSION - 版本号
OpenCV_LIB_VERSION - 某个库的版本
find_package()得原理是/usr/local/share/cmake-xxx/Modules
去找一个对应的库的脚本文件,这个脚本文件去搜索对应的头文件和库,并设置一下变量出来使用
2.4 link_directories注意
官方说明中,link_directories 要放在add_executable或add_libraries前,否则会导致ld cannot find的错误
3.ref
3.1 官方guide
3.2 cmake 添加头文件目录,链接动态、静态库
3.2 find_package,寻找boost的实例
3.3 cmake 命令速查
3.3 Cmake之深入理解find_package()的用法