当前位置:网站首页>CMake教程Step5(添加系统自检)
CMake教程Step5(添加系统自检)
2022-07-05 16:36:00 【开始沸腾了】
CMake官方文档
参考官方cmake3.24教程翻译。我这里使用cmake 3.16来演示例子。
https://cmake.org/cmake/help/v3.24/guide/tutorial/index.html
https://gitlab.kitware.com/cmake/cmake/-/tree/master/Help/guide/tutorial
step5
https://cmake.org/cmake/help/v3.24/guide/tutorial/Adding%20System%20Introspection.html
我的仓库 :
https://github.com/FRBoiling/cmake-tutorial.git
让我们考虑向项目中添加一些依赖于目标平台可能不具备的特性的代码。
对于本例,我们将添加一些依赖于目标平台是否具有log和exp函数的代码。当然,几乎每个平台都有这些功能,但在本教程中假设它们并不常见。
如果平台有log和exp,那么我们将使用它们在mysqrt函数中计算平方根。
我们首先使用MathFunctions/CMakeLists.txt中的CheckCXXSourceCompiles模块来测试这些函数的可用性。
在调用target_include_directories()之后,将log和exp的检查添加到MathFunctions/CMakeLists.txt:
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
# does this system provide the log and exp functions?
include(CheckCXXSourceCompiles)
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)
如果可用,使用target_compile_definitions()将HAVE_LOG和HAVE_EXP指定为私有编译定义。
if(HAVE_LOG AND HAVE_EXP)
target_compile_definitions(MathFunctions
PRIVATE "HAVE_LOG" "HAVE_EXP")
endif()
如果log和exp在系统上可用,那么我们将使用它们在mysqrt函数中计算平方根。将以下代码添加到math_functions/mysqrt.cxx中的mysqrt函数中(在返回结果之前不要忘记#endif):
#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;
我们还需要修改mysqrt.cxx包含cmath头文件。
#include <cmath>
到这里,mysqrt.cxx内容长这样:
#include <cmath>
#include <iostream>
#include "MathFunctions.h"
// a hack square root calculation using simple operations
double mysqrt(double x)
{
if (x <= 0) {
return 0;
}
// if we have both log and exp then use them
#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
return result;
}
运行cmake可执行文件或cmake-gui来配置项目,然后使用您选择的构建工具构建它,并运行教程可执行文件。
测试
现在哪个函数给出了更好的结果,sqrt还是mysqrt?
边栏推荐
- WR | 西湖大学鞠峰组揭示微塑料污染对人工湿地菌群与脱氮功能的影响
- [Jianzhi offer] 62 The last remaining number in the circle
- [first lecture on robot coordinate system]
- 【性能测试】全链路压测
- 手机开证券账户安全吗?怎么买股票详细步骤
- tf. sequence_ Mask function explanation case
- 微信公众号网页授权登录实现起来如此简单
- [Web attack and Defense] WAF detection technology map
- Writing method of twig array merging
- 什么是ROM
猜你喜欢

Deeply cultivate 5g, and smart core continues to promote 5g applications

Embedded UC (UNIX System Advanced Programming) -1

Hiengine: comparable to the local cloud native memory database engine

Jarvis OJ shell流量分析

Wsl2.0 installation

How to uninstall MySQL cleanly

高数 | 旋转体体积计算方法汇总、二重积分计算旋转体体积

thinkphp3.2.3

Application of threshold homomorphic encryption in privacy Computing: Interpretation
![[729. My Schedule i]](/img/e3/32914227d00cf7595ee850e60f2b72.png)
[729. My Schedule i]
随机推荐
Can you help me see what the problem is? [ERROR] Could not execute SQL stateme
【729. 我的日程安排錶 I】
Allusions of King Xuan of Qi Dynasty
[729. My schedule I]
Benji Banas membership pass holders' second quarter reward activities update list
[61dctf]fm
【7.7直播预告】《SaaS云原生应用典型架构》大咖讲师教你轻松构建云原生SaaS化应用,难题一一击破,更有华为周边好礼等你领!
C# TCP如何限制单个客户端的访问流量
How to uninstall MySQL cleanly
Summary of PHP pseudo protocol of cisp-pte
Is it safe to open futures accounts online? Will there be more liars online? Doesn't feel very reliable?
麻烦问下,DMS中使用Redis语法是以云数据库Redis社区版的命令为参考的嘛
C how TCP restricts the access traffic of a single client
Android privacy sandbox developer preview 3: privacy, security and personalized experience
SQL injection of cisp-pte (Application of secondary injection)
Cs231n notes (bottom) - applicable to 0 Foundation
【beanshell】数据写入本地多种方法
Scratch colorful candied haws Electronic Society graphical programming scratch grade examination level 3 true questions and answers analysis June 2022
时间戳strtotime前一天或后一天的日期
拷贝方式之DMA