find_package
1.两种模式
Moudule模式:搜索CMAKE_MODULE_PATH指定路径下和自己的Moudules目录下的FindXXX.cmake文件。
Config模式:搜索指定路径下的XXXConfig.cmake或者XXX-config.cmake文件。
2.寻找到之后将定义以下常用变量
<LibaryName>_FOUND
<LibaryName>_INCLUDE_DIR or <LibaryName>_INCLUDES
<LibaryName>_LIBRARY or <LibaryName>_LIBRARIES or <LibaryName>_LIBS
使用举例说明
find_package(CURL)
add_executable(curltest curltest.cc)
if(CURL_FOUND)
target_include_directories(clib PRIVATE ${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
message(FATAL_ERROR ”CURL library not found”)
endif(CURL_FOUND)
3.关于QUIET和REQUIRED选项
如果指定了QUIET选项,那么表示:就算未找到该包的配置文件,也不会报错。
相反地,如果指定了REQUIRED选项:如果未找到文件,会报错。
4.搜索优先级
cmake默认采用Moudle模式,如果失败,会采用Config模式。
但是如果事前指定XXX_DIR,会优先搜索XXX_DIR下的Config文件;如果XXX_DIR下未找到相应文件,CMake会从Moudule模式重新开始寻找
5.查找路径
首先查找${CMAKE_MODULE_PATH}中的所有目录,若为空,再查找自己的模块目录/usr/share/cmake-*/Moudules --> 官方库 --> Moudule模式
如果Moudule模式搜索失败,则进行Config模式进行搜索,以下为搜索目录
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U)
find_package查找的目录 举例
(1)在/usr/local/lib/cmake/lib-name的文件下的lib-nameConfig.cmake --> 自行源码编译安装的库
(2)在/usr/lib/cmake/lib-name的文件下的lib-nameConfig.cmake --> apt-get install 安装的库
(3)在/usr/share/cmake-*/Moudules的文件下的FindXXX.cmake文件 --> cmake默认就有的库
6.有组件的包
find_package(Qt COMPONENTS QtOpenGL QtXml REQUIRED)
7. 其他
在开发中,最常遇到环境问题,这个opencv版本不对,那个pcl版本不对,如果将原系统目录下的库卸载后重装新的版本,往往会出现一些意想不到的事,费时费力。
我常常这样做,如果系统中安装的PCL版本是1.10,但是我要用某个开源代码,它使用的是PCL1.8,这时候我会选择去下载PCL1.8编译,然后安装到其他目录下,不是/usr目录,然后只需要将CMakelists中对应的find_package改为指向指定目录查找就行了:
find_package(PCL REQUIRED
PATHS /media/fy/Disk/download/pcl/pcl-1.8 # look here
NO_DEFAULT_PATH)
后续会更新