find_package常用记录

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)

后续会更新
在这里插入图片描述

你可能感兴趣的:(C++,cmake,linux,find_package)