Linux
Linux software install
Google repo的使用
Vector AP StartApplication编译脚本解析
Yocto的cmake版本升级
不能自动安装的解决方式
S32G-BSP35.0-SDK使用方法
S32G从SDK生成文件系统的制作过程
Linux Samba设置
Linux添加双网卡
S32G USB-Redirector安装指南
VS code自动生成Doxygen格式注释
Linux下使用多线程下载
使用pandoc 生成带中文的pdf
minicom无法输入的问题解决办法
使用 systemd unit 添加一条路由规则
CMake 教程
步骤 1:基本起点
步骤 2:添加lib库
步骤 3:为库添加使用要求
步骤 4:添加生成器表达式
步骤 5:安装和测试
步骤 6:添加支持测试仪表板
步骤 7: 添加系统内省
步骤 8:自定义命令和生成的文
步骤 9:打包安装程序
步骤 10:选择静态库或共享库
步骤 11:添加导出配置
步骤 12:打包 Debug 和 Release
添加虚拟网卡
Vector AP 去掉防篡改校验
Vector AP startapplication编译与使用
Vector AP问题汇总
Vector AP大型项目开发流程
Vector AP EM
Vector AP 最简单的开发示例
Linux kernel 版本降级
Vector AP StartApplicaiton
startappplication-machine-design
startapplicaiton-machine-integration
amsr-vector-fs-em-executionmanager-design
amsr-vector-fs-em-executionmanager
Vector AP 复杂模型的开发
第一章 Machine和MachineDesign
第二章 Execute Manager
第三章 Log
第四章 State Manager
第五章 State Manager 源码的理解
第六章 Someip daemon
第七章 IPC Service Discovery Daemon
crond的使用方法
解决蓝牙鼠标在 Ubuntu 中单位时间内断开的问题
VPS服务器自建教程
v2rayA的客户端使用配置
GDB调试指南入门篇:揭开程序运行世界的神秘面纱
GDB调试指南高级篇:成为调试专家,掌控程序的命运
Linux安装PyQt5并配置Qt Designer
ADB 命令大全
GoogleTest(一)
GoogleTest(二)简单的TEST宏
GoogleTest(三)简单类函数测试
C++ Template
1. 函数模板
2. 类模板
3. 非类型模板参数
软件版本号规范
EPOLL
C++手札
C++ 使用{}初始化有哪些好处?
现代 C++ decltype 深入解析
函数对象(functor)
Linux性能剖析:CPU、内存、网络与I/O压力测试
AP StateManager
C++ Lambda表达式
C++ 中的Lambda表达式
Lambda 表达式语法
Lambda 表达式的示例
手动发送UDP数据包
pyqt5生成的UI界面不能输入中文
自己搭建repo镜像
摄影
Sony仿富士PP值设置
诗词歌赋
本文档使用 MrDoc 发布
-
+
首页
步骤 11:添加导出配置
在教程的 [`Installing and Testing`](Installing%20and%20Testing.html#guide:tutorial/Installing%20and%20Testing "tutorial/Installing and Testing") 部分中,我们添加了使 CMake 能够安装项目的库和头文件的功能。在 [`Packaging an Installer`](Packaging%20an%20Installer.html#guide:tutorial/Packaging%20an%20Installer "tutorial/Packaging an Installer") 部分中,我们添加了将这些信息打包起来以便分发给其他人的功能。 接下来的步骤是添加必要的信息,以便其他 CMake 项目可以使用我们的项目,无论是来自构建目录、本地安装还是打包后。 第一步是更新我们的 [`install(TARGETS)`](../../command/install.html#targets "install(targets)") 命令,不仅指定 `DESTINATION`,还指定 `EXPORT`。`EXPORT` 关键字生成一个包含从安装目录树中的所有目标列表中列出的所有目标的导入代码的 CMake 文件。因此,让我们继续通过更新 `MathFunctions/CMakeLists.txt` 中的 `install` 命令,明确地将 `MathFunctions` 库导出: ```cmake # 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` 的底部添加以下内容来实现: ```cmake # 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()`](../../command/target_include_directories.html#command:target_include_directories "target_include_directories"),以理解在从构建目录和从安装/打包中使用时需要不同的 `INTERFACE` 位置。这意味着将 `MathFunctions` 的 [`target_include_directories()`](../../command/target_include_directories.html#command:target_include_directories "target_include_directories") 调用转换为以下方式: ```cmake # MathFunctions/CMakeLists.txt target_include_directories(MathFunctions INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:include/> ) ``` 更新后,我们可以重新运行 CMake 并验证它不再报警。 此时,我们已经正确地打包了所需的目标信息,但我们仍然需要生成一个 `MathFunctionsConfig.cmake`,以便 CMake 的 [`find_package()`](../../command/find_package.html#command:find_package "find_package") 命令可以找到我们的项目。因此,让我们继续并在项目的顶层添加一个名为 `Config.cmake.in` 的新文件,其内容如下: ```cmake # Config.cmake.in @PACKAGE_INIT@ include ( "${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake" ) ``` 然后,为了正确配置和安装该文件,将以下内容添加到顶层 `CMakeLists.txt` 的底部: ```cmake # 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/MathFunctions" NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO ) ``` 接下来,执行 [`configure_package_config_file()`](../../module/CMakePackageConfigHelpers.html#command:configure_package_config_file "configure_package_config_file")。这个命令将使用一些特定的区别于标准 [`configure_file()`](../../command/configure_file.html#command:configure_file "configure_file") 的方法来配置提供的文件。为了正确利用此函数,输入文件应该有一行文本 `@PACKAGE_INIT@`,除了所需的内容之外。该变量将被替换为一段代码,将设置的值转换为相对路径。这些新的值可以通过相同的名称引用,但前面加上 `PACKAGE_` 前缀。 接下来是 [`write_basic_package_version_file()`](../../module/CMakePackageConfigHelpers.html#command:write_basic_package_version_file "write_basic_package_version_file")。这个命令将写入一个文件,该文件由 [`find_package()`](../../command/find_package.html#command:find_package "find_package") 使用,记录所需包的版本和兼容性。在这里,我们使用 `Tutorial_VERSION_*` 变量,并声明它与 `AnyNewerVersion` 兼容,这表示这个版本或任何更高版本都与请求的版本兼容。 ```cmake # CMakeLists.txt write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake" VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}" COMPATIBILITY AnyNewerVersion ) ``` 最后,将生成的两个文件都设置为要安装: ```cmake # CMakeLists.txt install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake DESTINATION lib/cmake/MathFunctions ) ``` 此时,我们已经生成了一个可移植的 CMake
admin
2024年3月4日 11:39
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码