一、文件树

  1. ├── CMakeLists.txt
  2. ├── main.cpp

1.1 main.cpp

  1. #include <iostream>
  2. #include <boost/shared_ptr.hpp>
  3. #include <boost/filesystem.hpp>
  4. // Boost 库是为C++语言标准库提供扩展的一些C++程序库的总称呢个,由Boost社区组织开发、维护。
  5. // Boost 库可以与C++标准库完美共同工作,并为其提供扩展功能。
  6. int main(int argc, char *argv[]) {
  7. std::cout << "Hello Third Party Include!" << std::endl;
  8. // use a shared ptr
  9. boost::shared_ptr<int> isp(new int(4));
  10. // trivial use of boost filesystem
  11. boost::filesystem::path path = "/usr/share/cmake/modules";
  12. if(path.is_relative()) {
  13. std::cout << "Path is relative" << std::endl;
  14. }
  15. else {
  16. std::cout << "Path is not relative" << std::endl;
  17. }
  18. return 0;
  19. }

1.2 CMakeLists.txt

  1. cmake_minimum_required(VERSION 3.5)
  2. project(third_party_include)
  3. # 使用库文件系统和系统查找boost install
  4. # 这个库是第三方库,而不是自己生成的静态/动态库
  5. find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)
  6. if(Boost_FOUND)
  7. message("boost found")
  8. else()
  9. message(FATAL_ERROR "Cannot find Boost")
  10. endif()
  11. # 添加可执行文件
  12. add_executable(third_party_include main.cpp)
  13. # 将可执行文件和三方库Boost链接起来
  14. 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 文件的顶部。

  1. 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

  1. if(Boost_FOUND)
  2. message ("boost found")
  3. include_directories(${Boost_INCLUDE_DIRS})
  4. else()
  5. message (FATAL_ERROR "Cannot find Boost")
  6. endif()

2.3 Exported Variables导出变量

找到包后,它会自动导出变量,这些变量可以通知用户在哪里可以找到库,头文件或可执行文件。与 XXX_FOUND 变量类似,它们与包绑定在一起,通常记录在 FindXXX.cmake 文件的顶部。

本例中的变量

  1. 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依赖关系。

要链接到导入的目标,可以使用以下命令:

  1. target_link_libraries( third_party_include PRIVATE Boost::filesystem )

2.5 使用非别名变量

尽管大多数现代库都使用导入的目标,但并非所有模块都已更新。 如果未更新库,则通常会发现以下可用变量:

  • xxx_INCLUDE_DIRS : 指向库的包含目录的变量。
  • xxx_LIBRARY : 指向库路径的变量。

然后可以将它们添加到您的 target_include_directoriestarget_link_libraries 中,如下所示:

  1. # 包含Boost的头文件
  2. target_include_directories( third_party_include
  3. PRIVATE ${Boost_INCLUDE_DIRS}
  4. )
  5. # 连接到Boost的库
  6. target_link_libraries( third_party_include
  7. PRIVATE
  8. ${Boost_SYSTEM_LIBRARY}
  9. ${Boost_FILESYSTEM_LIBRARY}
  10. )

三、构建编译

  1. $ cmake ..
  2. $ make

四、安装Boost库

§ 7. Including Third Party Library - 图1 进入官网:Boost C++ Libraries,下载安装包

§ 7. Including Third Party Library - 图2 解压安装包

  1. tar -zvxf boost_1_77_0.tar.gz

§ 7. Including Third Party Library - 图3cd 进入根目录,然后执行:

  1. ./bootstrap.sh

§ 7. Including Third Party Library - 图4 安装,时间很长

  1. ./b2 install