一、文件树
├── CMakeLists.txt├── main.cpp
1.1 main.cpp
#include <iostream>#include <boost/shared_ptr.hpp>#include <boost/filesystem.hpp>// Boost 库是为C++语言标准库提供扩展的一些C++程序库的总称呢个,由Boost社区组织开发、维护。// Boost 库可以与C++标准库完美共同工作,并为其提供扩展功能。int main(int argc, char *argv[]) {std::cout << "Hello Third Party Include!" << std::endl;// use a shared ptrboost::shared_ptr<int> isp(new int(4));// trivial use of boost filesystemboost::filesystem::path path = "/usr/share/cmake/modules";if(path.is_relative()) {std::cout << "Path is relative" << std::endl;}else {std::cout << "Path is not relative" << std::endl;}return 0;}
1.2 CMakeLists.txt
cmake_minimum_required(VERSION 3.5)project(third_party_include)# 使用库文件系统和系统查找boost install# 这个库是第三方库,而不是自己生成的静态/动态库find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)if(Boost_FOUND)message("boost found")else()message(FATAL_ERROR "Cannot find Boost")endif()# 添加可执行文件add_executable(third_party_include main.cpp)# 将可执行文件和三方库Boost链接起来target_link_libraries(third_party_include PRIVATE Boost::filesystem)
二、CMake命令解析
几乎所有不平凡的项目都将要求包含第三方库,头文件或程序。 CMake 支持使用 find_package() 函数查找这些工具的路径。 这将从 CMAKE_MODULE_PATH 中的文件夹列表中搜索格式为 “FindXXX.cmake” 的 CMake 模块。 在 Linux 上,默认搜索路径将是 /usr/share/cmake/Modules。 在我的系统上,这包括对大约142个通用第三方库的支持。
此示例要求将 Boost 库安装在默认系统位置。
2.1 find_package()查找库
如上所述,find_package() 函数将从 CMAKE_MODULE_PATH 中的文件夹列表中搜索 “FindXXX.cmake” 中的 CMake 模块。 find_package 参数的确切格式取决于要查找的模块。 这通常记录在 FindXXX.cmake 文件的顶部。
find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)
参数:
- Boost:库名称,这是用于查找模块文件 FindBoost.cmake 的一部分
- 1.46.1:需要的 boost 库最低版本
- REQUIRED:告诉模块这是必须的,如果找不到会报错
- COMPONENTS:要查找的库列表,从后面的参数代表的库里找 boost
可以使用更多参数,也可以使用其他变量。 在后面的示例中提供了更复杂的设置。
2.2 是否查找到库?
大多数被包含的包将设置变量 XXX_FOUND,该变量可用于检查软件包在系统上是否可用。
在此示例中,变量为 Boost_FOUND:
if(Boost_FOUND)message ("boost found")include_directories(${Boost_INCLUDE_DIRS})else()message (FATAL_ERROR "Cannot find Boost")endif()
2.3 Exported Variables导出变量
找到包后,它会自动导出变量,这些变量可以通知用户在哪里可以找到库,头文件或可执行文件。与 XXX_FOUND 变量类似,它们与包绑定在一起,通常记录在 FindXXX.cmake 文件的顶部。
本例中的变量
Boost_INCLUDE_DIRS - boost头文件的路径
在某些情况下,您还可以通过使用 ccmake 或 cmake-gui 检查缓存来检查这些变量。
2.4 使用别名变量
大多数 modern CMake 库在其模块文件中导出别名目标。 导入目标的好处是它们也可以填充包含目录和链接的库。 例如,从 CMake v3.5 开始,Boost 模块支持此功能。 与使用自己的别名目标相似,模块中的别名可以使引用找到的目标变得更加容易。 对于 Boost,所有目标均使用 Boost :: 标识符,然后使用子系统名称导出。 例如,您可以使用:
Boost::bost:表示头文件库Boost::system:表示 boost 系统库Boost::filesystem:表示 boost 系统文件库
与您自己的目标一样,这些目标包括它们的依赖关系,因此与Boost :: filesystem链接将自动添加Boost :: boost和Boost :: system依赖关系。
要链接到导入的目标,可以使用以下命令:
target_link_libraries( third_party_include PRIVATE Boost::filesystem )
2.5 使用非别名变量
尽管大多数现代库都使用导入的目标,但并非所有模块都已更新。 如果未更新库,则通常会发现以下可用变量:
xxx_INCLUDE_DIRS: 指向库的包含目录的变量。xxx_LIBRARY: 指向库路径的变量。
然后可以将它们添加到您的 target_include_directories 和 target_link_libraries 中,如下所示:
# 包含Boost的头文件target_include_directories( third_party_includePRIVATE ${Boost_INCLUDE_DIRS})# 连接到Boost的库target_link_libraries( third_party_includePRIVATE${Boost_SYSTEM_LIBRARY}${Boost_FILESYSTEM_LIBRARY})
三、构建编译
$ cmake ..$ make
四、安装Boost库
进入官网:Boost C++ Libraries,下载安装包
解压安装包
tar -zvxf boost_1_77_0.tar.gz
cd 进入根目录,然后执行:
./bootstrap.sh
安装,时间很长
./b2 install
