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 发布
-
+
首页
步骤 7: 添加系统内省
让我们考虑向我们的项目中添加一些依赖于目标平台可能没有的功能的代码。在这个示例中,我们将添加一些依赖于目标平台是否具有 log 和 exp 函数的代码。当然,几乎每个平台都有这些功能,但在本教程中假设它们不常见。 ## Exercise 1 - Assessing Dependency Availability ### Goal 根据可用的系统依赖性更改实现。 第 7 步:添加系统内省 让我们考虑向我们的项目中添加一些依赖于目标平台可能没有的功能的代码。在这个示例中,我们将添加一些依赖于目标平台是否具有 `log` 和 `exp` 函数的代码。当然,几乎每个平台都有这些功能,但在本教程中假设它们不常见。 ### 练习 1 - 评估依赖性的可用性 #### 目标 根据可用的系统依赖性更改实现。 ### Helpful Resources - [CheckCXXSourceCompiles](../../module/CheckCXXSourceCompiles.html#module:CheckCXXSourceCompiles) - [target_compile_definitions](../../command/target_compile_definitions.html#command:target_compile_definitions) #### Files to Edit - `MathFunctions/CMakeLists.txt` - `MathFunctions/mysqrt.cxx` #### Getting Started 起始源代码提供在 `Step7` 目录中。在这个练习中,完成 `TODO 1` 到 `TODO 5`。 首先编辑 `MathFunctions/CMakeLists.txt`。包含 `CheckCXXSourceCompiles` 模块。然后,使用 `check_cxx_source_compiles` 来确定 `log` 和 `exp` 是否可从 `cmath` 获取。如果它们可用,使用 `target_compile_definitions()` 来指定 `HAVE_LOG` 和 `HAVE_EXP` 作为编译定义。 在 `MathFunctions/mysqrt.cxx` 中,包含 `cmath`。然后,如果系统具有 `log` 和 `exp`,则使用它们来计算平方根。 ### Build and Run 创建一个名为 `Step7_build` 的新目录。运行 `cmake` 或 `cmake-gui` 可执行文件来配置项目,然后使用您选择的构建工具构建它并运行 `Tutorial` 可执行文件。 ```bash mkdir Step7_build cd Step7_build cmake ../Step7 cmake --build . ``` 现在哪个函数给出更好的结果,`sqrt` 还是 `mysqrt`? ### Solution 在这个练习中,我们将使用 `CheckCXXSourceCompiles` 模块中的函数,所以首先我们必须在 `MathFunctions/CMakeLists.txt` 中包含它。 #### **TODO 1:** 将以下代码包含在 `MathFunctions/CMakeLists.txt` 中: ```cmake include(CheckCXXSourceCompiles) ``` 然后使用 `check_cxx_source_compiles` 测试 `log` 和 `exp` 的可用性。这个函数让我们在真正的源代码编译之前尝试编译带有所需依赖关系的简单代码。结果变量 `HAVE_LOG` 和 `HAVE_EXP` 表示这些依赖关系是否可用。 #### **TODO 2:** 将以下代码添加到 `MathFunctions/CMakeLists.txt` 中: ```cmake check_cxx_source_compiles(" #include <cmath> int main() { std::log(1.0); return 0; } " HAVE_LOG) check_cxx_source_compiles(" #include <cmath> int main() { std::exp(1.0); return 0; } " HAVE_EXP) ``` 接下来,我们需要将这些 CMake 变量传递给我们的源代码。这样,我们的源代码就可以知道有哪些资源可用。如果 `log` 和 `exp` 都可用,则使用 `target_compile_definitions()` 指定 `HAVE_LOG` 和 `HAVE_EXP` 作为 `PRIVATE` 编译定义。 #### **TODO 3:** 将以下代码添加到 `MathFunctions/CMakeLists.txt` 中: ```cmake if(HAVE_LOG AND HAVE_EXP) target_compile_definitions(SqrtLibrary PRIVATE "HAVE_LOG" "HAVE_EXP" ) endif() target_link_libraries(MathFunctions PRIVATE SqrtLibrary) ``` 由于我们可能会使用 `log` 和 `exp`,所以我们需要修改 `mysqrt.cxx` 来包含 `cmath`。 #### **TODO 4:** 将以下代码添加到 `MathFunctions/mysqrt.cxx` 中: ```cpp #include <cmath> ``` 如果系统上有 `log` 和 `exp`,那么在 `mysqrt` 函数中使用它们来计算平方根。`MathFunctions/mysqrt.cxx` 中的 `mysqrt` 函数如下所示: #### **TODO 5:** 将以下代码添加到 `MathFunctions/mysqrt.cxx` 中: ```cpp #if defined(HAVE_LOG) && defined(HAVE_EXP) double result = std::exp(std::log(x) * 0.5); std::cout << "Computing sqrt of " << x << " to be " << result << " using log and exp" << std::endl; #else double result = x; // do ten iterations for (int i = 0; i < 10; ++i) { if (result <= 0) { result = 0.1; } double delta = x - (result * result); result = result + 0.5 * delta / result; std::cout << "Computing sqrt of " << x << " to be " << result << std::endl; } #endif ```
admin
2024年3月4日 11:23
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码