#Cmake#__find_package函数的使用说明

#Cmake#__find_package函数的使用说明

    • 参数声明
    • 工作原理
    • 常用方式
    • 作用域说明

参数声明

find_package用于搜索安装到系统的库的.cmake文件,加载库和头文件的路径,自主开发库时可以编写好加在库和头文件的.cmake文件,其他工程使用该库时,通过find_package加载使用,具体定义如下:

find_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模式可以导入自定义的库。

  1. 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 来判断模块是否被找到。

  2. 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)

常用方式

  1. 经常的使用方式是find_package(package version REQUIRED),有时候version会省略,此时会搜索到系统当前的版本,对于package参数,每个第三库会进行定义,具体的名称可以找到库的说明文档进行查看。
find_package(OpenCV REQUIRED)
  1. 如果程序中使用了多个版本的库,那么建议指定路径和版本来加载库。比如:
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)
  1. CMakeList1、CMakeList2、CMakeList3中可以target_link_libraries(target1/2/3 OpenCV),CMakeList4中不可以target_link_libraries(target4 OpenCV);
  2. find_package加载的库作用域范围在当前CMakeList3和子CMakeList1/2范围内;对于上层作用域CMakeList5和其他作用域CMakeList4都不能使用target_link_libraries(target4/5 OpenCV);

  1. Cmake之深入理解find_package()的用法 ↩︎

你可能感兴趣的:(编译工具,cmake)