导出

导出#

危险

从 CMake 3.15 开始,导出的默认行为发生了变化。由于更改用户主目录中的文件被认为是“出乎意料的”(而且确实如此,这也是本章存在的原因),因此不再作为默认行为。如果你设置最低或最高 CMake 版本为 3.15 或更高版本,除非你按照以下方式设置 CMAKE_EXPORT_PACKAGE_REGISTRY,否则这种情况将不再发生。

从另一个项目访问一个项目有三种方法:子目录、导出的构建目录和安装。要在另一个项目中使用一个项目的构建目录,你需要导出目标。为了正确安装,需要导出目标;而允许使用构建目录只需添加两行代码。这通常不是我推荐的工作方式,但对于开发和作为后面讨论的安装过程的准备方式可能很有用。

你应该创建导出集,可能靠近你的主 CMakeLists.txt 的末尾。

export(TARGETS MyLib1 MyLib2 NAMESPACE MyLib:: FILE MyLibTargets.cmake)

这会将你列出的目标放入构建目录中的文件,并可选地为其添加命名空间前缀。现在,为了让 CMake 能够找到这个包,需要将包导出到 $HOME/.cmake/packages 文件夹:

set(CMAKE_EXPORT_PACKAGE_REGISTRY ON)
export(PACKAGE MyLib)

现在,如果你 find_package(MyLib),CMake 就能找到构建目录。查看生成的 MyLibTargets.cmake 文件,以帮助你理解具体创建了什么;它只是普通的 CMake 文件,包含了导出的目标。

需要注意的是,存在缺点:如果你有导入的依赖,它们需要在 find_package 之前导入。这将在下一个方法中解决。