通过find_package引入开源软件的库(动态或者静态库,或者仅包含头文件的库)。CMake官方,在cmake安装路径下的/share/cmake-<version>/Modules目录中,为我们提供了许多寻找依赖包的Find<PackageName>.cmake命名的文件。具体相关模块的介绍,可以查看官方文档:cmake-modules。
注:在全量源码构建时,一般不会,也不能用cmake预定义的路径下的Find<PackageName>.cmake文件。
由于Windows中,编写动态库,并使用动态库,代码书写比较麻烦。因此,这一章节,将在win10 + wsl2 + Ubuntu环境下,实现相关的demo。
find_package一般支持两种查找库的方式:
- Module模式
- Config模式
Module模式
cmake将在CMAKE_MODULE_PATH
路径下查找Find<PackageName>.cmake
文件。如果在Module模式下未找到,将采用Config模式继续查找PackageName
。
注意
CMAKE_MODULE_PATH
:必须指明到Find<PackageName>.cmake
文件所在的具体详细的路径。find_package
函数中的PackageName
与Find<PackageName>.cmake
文件名中的PackageName
保持一致。find_package
函数中,最好使用REQUIRED
参数,在未找到PackageName
,将报告错误,提前识别构建工程中的错误。
在Module模式中,定义的Find<PackageName>.cmake
文件内容,需要定义以下几个变量:
<PackageName>_FOUND
: bool值,表示当前PackageName
是否已找到。<PackageName>_INCLUDE_DIR
或者<PackageName>_INCLUDES
: 表示当前对外提供的头文件接口所在的头文件目录。<PackageName>_LIBRARIES
或者<PackageName>_LIBRARY
:表示提供的动态库集合。
当然,在Find<PackageName>.cmake
文件中的几个变量,可另起他名,但在使用时,就不太方便。因此,还是建议使用约定俗成的变量名称。
示例
整个目录结构如下:
.
├── CMakeLists.txt
├── opensource
│ └── calculator
│ ├── CMakeLists.txt
│ ├── FindCalculator.cmake
│ ├── add.cpp
│ └── include
│ └── add.h
└── src
├── CMakeLists.txt
└── main.cpp
各个cpp文件和头文件与之前相同,其他的CMakeLists.txt和cmake文件将一一列举。
./CMakeLists.txt
文件内容:
cmake_minimum_required(VERSION 3.16)
project(find_package_demo VERSION 1.0.0)
set(CMAKE_CXX_COMPILER g++)
add_subdirectory(src)
./src/CMakeLists.txt
文件内容:
# 查找开源动态库 Calculator
set(CMAKE_MODULE_PATH ${C