参数声明
find_package用于搜索安装到系统的库的.cmake文件,加载库和头文件的路径,自主开发库时可以编写好加在库和头文件的.cmake文件,其他工程使用该库时,通过find_package加载使用,具体定义如下:
find_package(<package> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...] [NO_POLICY_SCOPE])
[version] [EXACT]:限定使用软件版本
[REQUIRED]:如果没有找到库,返回错误信息,常用参数
[QUIET]:如果没有找到库,不返回信息
[MODULE]:设置为module模式,与config模式对应,表示查找的.cmake文件的路径有所区别
工作原理
find_package有2种搜索模式:
默认先采用Module模式在CMAKE_MODULE_PATH中进行搜索,其中CMAKE_MODULE_PATH可通过set进行指定路径,若找不到再采用Config模式进行搜索。其中Module模式中定义了cmake官方定义的第三库,Config模式可以导入自定义的库。
Module模式
搜索CMAKE_MODULE_PATH指定路径(cmake_path/share/cmake-version/Modules)下面的FindLibName.cmake文件,FindLibName.cmake文件会找到对应的LibName库,可以在cmake官网找到官方定义的FindLibName.cmake文件。
每个FindLibName.cmake模块都定义了若干变量,包括LibName_FOUND,LibName_INCLUDE_DIR or LibName_INCLUDES,LibName_LIBRARY or LibName_LIBRARIES
可以通过LibName_FOUND 来判断模块是否被找到。Config模式
在find_package搜索路径下搜索LibNameConfig.cmake文件或LibName-config.cmake文件。一般使用Config模式导入自定义的库时,先设定将自定义库的路径添加到CMAKE_PREFIX_PATH,然后在使用find_package进行搜索1。如下所示:
set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/share/Serv")
find_package(Serv REQUIRED)
常用方式
- 经常的使用方式是find_package(package version REQUIRED),有时候version会省略,此时会搜索到系统当前的版本,对于package参数,每个第三库会进行定义,具体的名称可以找到库的说明文档进行查看。
find_package(OpenCV REQUIRED)
- 如果程序中使用了多个版本的库,那么建议指定路径和版本来加载库。比如:
set(OpenCV_DIR /usr/include/OpenCV/3.2.0)
find_package(OpenCV 3.2.0 REQUIRED)
作用域说明
CMakeList3.txt
find_package(OpenCV REQUIRED)
add_subdirectory(CMakeList1.txt)
add_subdirectory(CMakeList2.txt)
CMakeList4.txt
CMakeList5.txt
add_subdirectory(CMakeList3.txt)
add_subdirectory(CMakeList4.txt)
- CMakeList1、CMakeList2、CMakeList3中可以target_link_libraries(target1/2/3 OpenCV),CMakeList4中不可以target_link_libraries(target4 OpenCV);
- find_package加载的库作用域范围在当前CMakeList3和子CMakeList1/2范围内;对于上层作用域CMakeList5和其他作用域CMakeList4都不能使用target_link_libraries(target4/5 OpenCV);