探究了Cmake的 find_package()
的行为,以及在Windows下的使用注意。
参考的网址
- github上面的一个CMake学习项目,里面有一个文档和实例探究了
find_package()
的相关使用。链接:https://github.com/BrightXiaoHan/CMakeTutorial/tree/master/FindPackage - CMake官网对
find_package()
的解释。链接:https://cmake.org/cmake/help/latest/command/find_package.html
这篇文章实质就是对第一个链接的学习和记录,以及对第二个链接的翻译。
find_package()的基本使用
find_packge()
就是在项目需要使用到一个库时,通过这条指令让程序自动去电脑中寻找指定的包,并且返回一些变量,记录寻找的结果。
返回的变量通常有 <LibaryName>_FOUND
、 <LibaryName>_INCLUDE_DIR
or <LibaryName>_INCLUDES
、<LibaryName>_LIBRARY
or <LibaryName>_LIBRARIES
<LibaryName>_FOUND
该变量是寻找结果,如果找到为真,没有找到为假。
<LibaryName>_INCLUDE_DIR
or <LibaryName>_INCLUDES
找到的库的头文件所在地址
<LibaryName>_LIBRARY
or <LibaryName>_LIBRARIES
找到的库的源文件地址
所以对于一个库的使用,就可以先通过 <LibaryName>_FOUND
判断是否找到,如果找到,就可以根据需求利用 <LibaryName>_INCLUDE_DIR
添加头文件路径和 <LibaryName>_LIBRARY
添加源文件。
那此时,就有两个问题:1. find_package()
能添加哪些库呢?2. 它会在哪些路径去找库呢?下面就解决这两个问题。
find_package()适用的库和查找的模式
find_package()
支持两种库文件的导入。一种是通过Cmake内置模块引入依赖包,另一种是引入非官方的库(该方式只对支持cmake编译安装的库有效),查找模式也有两种,Module模式与Config模式。详细解释参看上面给出的第一个链接。
一般情况,下载的第三方库使用的是Config模式,即主要通过<LibraryName>Config.cmake
or <lower-case-package-name>-config.cmake
这两个文件来引入我们需要的库。即要在搜索路径中找到这两个文件中一个。
在Linux环境下,环境管理更为合理,安装的第三方库在安装之后,会在/usr/local/lib/cmake/<LibraryName>/
目录下生成了<LibraryName>-config.cmake
文件,而/usr/local/lib/cmake/<LibraryName>/
正是find_package函数的搜索路径之一。
在Windows操作系统下,搜索路径与Linux不一样(find_package的搜索路径是一系列的集合,而且在linux,windows,mac上都会有所区别,需要的可以参考官方文档find_package)
Windows操作系统中使用find_package()导入第三方库
第一步,找到对应库的官网,按照指示通过Cmake工具对其进行build。然后会生成一个文件夹,一般该文件夹包括两个子文件夹include
、lib
,分别就是头文件夹和源文件编译后的文件。
第二步,将上面文件夹的路径添加到系统环境变量中。
下面,以Boost库为例。
Boost库
Boost库官网:https://www.boost.org/
在官网下载压缩包后解压,得到源码文件,按照官网的提示,进行如下的build操作:
- 进入目录
boost_1_XX_X\
,打开终端(cmd或者PowerShell) ./bootstrap.bat
-
./b2
(可以通过toolset
和prefix
设置编译器和安装路径)
到这里,Boost库已经安装完成,为了find_package()能找到它,将生成的地址(刚刚 prefix
所指定的地址)添加到系统环境变量,Boost可以使用了。