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 发布
-
+
首页
步骤 3:为库添加使用要求
## Exercise 1 - Adding Usage Requirements for a Library 目标的使用要求参数允许对库或可执行文件的链接和包含行进行更好的控制,同时还可以更好地控制 CMake 内部目标的传递属性。主要利用使用要求的命令有: + `target_compile_definitions()` + `target_compile_options()` + `target_include_directories()` + `target_link_directories()` + `target_link_options()` + `target_precompile_headers()` + `target_sources()` ### Goal 为库添加使用要求。 ### Helpful Materials + `CMAKE_CURRENT_SOURCE_DIR` ### Files to Edit + `MathFunctions/CMakeLists.txt` + `CMakeLists.txt` ### Getting Started 在这个练习中,我们将重构我们从 `添加一个库` 开始的代码,以使用现代的 CMake 方法。我们将让我们的库自己定义其所需的使用要求,以便根据需要将它们传递给其他目标。在这种情况下,`MathFunctions` 将自己指定所需的包含目录。然后,使用 `MathFunctions` 的消费目标 `Tutorial` 只需要链接到 `MathFunctions`,而不必担心任何额外的包含目录。 起始源代码已提供在 `Step3` 目录中。在这个练习中,完成 `TODO 1` 到 `TODO 3`。 首先,在 `MathFunctions/CMakeLists` 中添加一个调用 `target_include_directories()`。记住 `CMAKE_CURRENT_SOURCE_DIR` 是当前正在处理的源目录的路径。 然后,在顶层 `CMakeLists.txt` 中更新(并简化!)对 `target_include_directories()` 的调用。 ### Build and Run 创建一个名为 `Step3_build` 的新目录,运行 `cmake` 可执行文件或 `cmake-gui` 来配置项目,然后使用你选择的构建工具构建它,或者在构建目录中使用 `cmake --build .`。以下是在命令行中执行此操作的示例: ```shell mkdir Step3_build cd Step3_build cmake ../Step3 cmake --build . ``` 接下来,使用新构建的 Tutorial 并验证它是否按预期工作。 ### Solution 让我们更新上一步的代码,采用现代的 CMake 方法来处理使用需求。 我们想要声明任何链接到 `MathFunctions` 的人都需要包含当前源目录,而 `MathFunctions` 本身则不需要。这可以通过使用 `INTERFACE` 使用需求来表达。记住,`INTERFACE` 表示消费者需要的内容,而生产者则不需要。 在 `MathFunctions/CMakeLists.txt` 的末尾,使用 `target_include_directories()` 以 `INTERFACE` 关键字,如下所示: TODO 1: MathFunctions/CMakeLists.txt ```cmake target_include_directories(MathFunctions INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} ) ``` 现在我们已经为 `MathFunctions` 指定了使用需求,我们可以安全地删除顶层 `CMakeLists.txt` 中对 `EXTRA_INCLUDES` 变量的使用。 删除这一行: TODO 2: CMakeLists.txt ```cmake list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions") ``` 并且从 `target_include_directories` 中删除 `EXTRA_INCLUDES`: TODO 3: CMakeLists.txt ```cmake target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" ) ``` 请注意,使用这种技术,我们的可执行目标要使用库只需调用 `target_link_libraries()`并提供库目标的名称。在更大的项目中,手动指定库依赖关系的传统方法会变得非常复杂。 ## Exercise 2 - Setting the C++ Standard with Interface Libraries 现在我们已经将代码切换到了更现代的方法,让我们演示一种现代的技术,用于将属性设置给多个目标。 让我们重构现有的代码,使用一个`INTERFACE`库。我们将在下一步中使用该库来演示 `generator expressions` 的常见用法。 ### Goal 添加一个 `INTERFACE` 类型的库目标来指定所需的 C++ 标准。 ### Helpful Resources + `add_library()` + `target_compile_features()` + `target_link_libraries()` ### Files to Edit + `CMakeLists.txt` + `MathFunctions/CMakeLists.txt` ### Getting Started 在这个练习中,我们将重构我们的代码,使用一个 `INTERFACE` 库来指定 C++ 标准。 从 Step3 练习1 的结束处开始这个练习。你需要完成 `TODO 4` 到 `TODO 7`。 首先编辑顶层的 `CMakeLists.txt` 文件。构建一个名为 `tutorial_compiler_flags` 的 `INTERFACE` 库目标,并将 `cxx_std_11` 指定为目标编译器特性。 修改 `CMakeLists.txt` 和 `MathFunctions/CMakeLists.txt`,以便所有目标都有一个 `target_link_libraries()` 调用到 `tutorial_compiler_flags`。 ### Build and Run 由于我们已经在练习1中配置了构建目录,只需调用以下命令重新构建我们的代码: ```cmake cd Step3\_build cmake --build . ``` 接下来,使用新构建的 `Tutorial` 并验证其是否按预期工作。 ### Solution 让我们更新上一步中的代码,使用接口库来设置我们的 C++ 要求。 首先,我们需要移除两个关于变量 `CMAKE_CXX_STANDARD` 和 `CMAKE_CXX_STANDARD_REQUIRED` 的 `set()` 调用。需要移除的具体行如下: CMakeLists.txt ```cmake set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) ``` 接下来,我们需要创建一个接口库,名为 `tutorial_compiler_flags`。然后使用 `target_compile_features()` 添加编译器特性 `cxx_std_11`。 #### TODO 4: CMakeLists.txt ```cmake add_library(tutorial_compiler_flags INTERFACE) target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11) ``` 最后,使用我们新建的 `tutorial_compiler_flags` 库,将我们的可执行文件 `Tutorial`、我们的 `SqrtLibrary` 库和我们的 `MathFunctions` 库链接起来。代码如下所示: #### TODO 5: CMakeLists.txt ```cmake target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags) ``` #### TODO 6: MathFunctions/CMakeLists.txt ```cmake target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags) ``` #### TODO 7: MathFunctions/CMakeLists.txt ```cmake target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags) ``` 通过这种方式,我们所有的代码仍然需要 C++ 11 来构建。但请注意,通过这种方法,我们可以具体指定哪些目标需要特定的要求。此外,我们在接口库中创建了一个单一的真实来源。
admin
2024年3月1日 11:15
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码