添加导出配置

添加导出配置


下一篇:练习12 打包调试和发布,上一篇:练习10 选择静态或共享库目录首页

温故知新

经过第一个练习,大家对于基本的使用应该已经掌握了,由于代码过多,在文档中详细介绍太过于啰嗦,大家可以自行下载代码参考

在本教程中,我们添加了 CMake 安装项目库和标头的功能。在此期间, 我们添加了打包这些信息的功能,以便将其分发给其他人。[Installing and Testing](https://cmake.org/cmake/help/latest/guide/tutorial/Installing and Testing.html#guide:tutorial/Installing and Testing)[Packaging an Installer](https://cmake.org/cmake/help/latest/guide/tutorial/Packaging an Installer.html#guide:tutorial/Packaging an Installer)

下一步是添加必要的信息,以便其他 CMake 项目可以使用我们的项目,无论是来自构建目录、本地安装还是打包时。

第一步是更新我们的install(TARGETS)命令不仅可以指定 a DESTINATION,还可以指定EXPORT. 该EXPORT关键字生成一个 CMake 文件,其中包含用于从安装树导入安装命令中列出的所有目标的代码。因此,让我们继续通过 将命令更新为如下所示来显式地显示EXPORT库:MathFunctions``install``MathFunctions/CMakeLists.txt

  • MathFunctions/CMakeLists.txt
set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)
  list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs}
        EXPORT MathFunctionsTargets
        DESTINATION lib)
# install include headers
install(FILES MathFunctions.h DESTINATION include)

现在我们已经MathFunctions导出了,我们还需要显式安装生成的MathFunctionsTargets.cmake文件。这是通过将以下内容添加到顶层的底部来完成的CMakeLists.txt

  • CMakeLists.txt
install(EXPORT MathFunctionsTargets
  FILE MathFunctionsTargets.cmake
  DESTINATION lib/cmake/MathFunctions
)

此时您应该尝试运行 CMake。如果一切设置正确,您将看到 CMake 将生成如下错误:

Target "MathFunctions" INTERFACE_INCLUDE_DIRECTORIES property contains
path:

  "/Users/robert/Documents/CMakeClass/Tutorial/Step11/MathFunctions"

which is prefixed in the source directory.

CMake 想说的是,在生成导出信息的过程中,它将导出一条与当前机器本质上相关的路径,并且在其他机器上无效。解决这个问题的方法是更新 MathFunctions target_include_directories()了解INTERFACE在构建目录和安装/包中使用它时需要不同的位置。这意味着转换 target_include_directories()要求MathFunctions看起来像:

  • MathFunctions/CMakeLists.txt
target_include_directories(MathFunctions
                           INTERFACE
                            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                            $<INSTALL_INTERFACE:include>
                           )

更新后,我们可以重新运行 CMake 并验证它是否不再发出警告。

此时,我们已经 CMake 正确打包了所需的目标信息,但我们仍然需要生成MathFunctionsConfig.cmake一个find_package()命令可以找到我们的项目。因此,让我们继续将一个新文件添加到名为的项目的顶层, Config.cmake.in其中包含以下内容:

  • 配置.cmake.in
@PACKAGE_INIT@

include ( "${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake" )

然后,要正确配置和安装该文件,请将以下内容添加到顶层的底部CMakeLists.txt

  • CMakeLists.txt
install(EXPORT MathFunctionsTargets
  FILE MathFunctionsTargets.cmake
  DESTINATION lib/cmake/MathFunctions
)

include(CMakePackageConfigHelpers)

接下来,我们执行configure_package_config_file()。此命令将配置提供的文件,但与标准有一些具体差异configure_file()方式。@PACKAGE_INIT@为了正确利用此功能,输入文件除了所需的内容外还应包含一行文本。该变量将被替换为将设置值转换为相对路径的代码块。这些新值可以通过相同的名称引用,但前面加上PACKAGE_前缀。

  • CMakeLists.txt
install(EXPORT MathFunctionsTargets
  FILE MathFunctionsTargets.cmake
  DESTINATION lib/cmake/MathFunctions
)

include(CMakePackageConfigHelpers)
# generate the config file that includes the exports
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
  "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake"
  INSTALL_DESTINATION "lib/cmake/example"
  NO_SET_AND_CHECK_MACRO
  NO_CHECK_REQUIRED_COMPONENTS_MACRO
  )

write_basic_package_version_file()接下来是。该命令写入一个文件,该文件由find_package(),记录所需包的版本和兼容性。在这里,我们使用Tutorial_VERSION_* 变量并说它与 兼容AnyNewerVersion,这表示该版本或任何更高版本与请求的版本兼容。

  • CMakeLists.txt
write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake"
  VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}"
  COMPATIBILITY AnyNewerVersion
)

最后,设置要安装的两个生成的文件:

  • CMakeLists.txt
install(FILES
  ${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake
  DESTINATION lib/cmake/MathFunctions
  )

至此,我们已经为项目生成了可重定位的 CMake 配置,可以在项目安装或打包后使用。如果我们希望我们的项目也可以从构建目录中使用,我们只需将以下内容添加到顶层的底部CMakeLists.txt

  • CMakeLists.txt
export(EXPORT MathFunctionsTargets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsTargets.cmake"
)

通过此导出调用,我们现在生成一个,允许其他项目使用构建目录中的MathFunctionsTargets.cmake配置,而无需安装它。MathFunctionsConfig.cmake


下一篇:练习12 打包调试和发布,上一篇:练习10 选择静态或共享库目录首页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值