当前位置:网站首页>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?
边栏推荐
- 采用药丸屏的iPhone14或引发中国消费者的热烈抢购
- 【性能测试】全链路压测
- tf. sequence_ Mask function explanation case
- Keras crash Guide
- [team PK competition] the task of this week has been opened | question answering challenge to consolidate the knowledge of commodity details
- 张平安:加快云上数字创新,共建产业智慧生态
- Hiengine: comparable to the local cloud native memory database engine
- Is it safe to open a securities account by mobile phone? Detailed steps of how to buy stocks
- Scratch colorful candied haws Electronic Society graphical programming scratch grade examination level 3 true questions and answers analysis June 2022
- Jarvis OJ 简单网管协议
猜你喜欢

thinkphp模板的使用

The first EMQ in China joined Amazon cloud technology's "startup acceleration - global partner network program"

How to install MySQL

The two ways of domestic chip industry chain go hand in hand. ASML really panicked and increased cooperation on a large scale

Bs-xx-042 implementation of personnel management system based on SSM

Learnopongl notes (I)

干货!半监督预训练对话模型 SPACE

How to uninstall MySQL cleanly

兰空图床苹果快捷指令

深耕5G,芯讯通持续推动5G应用百花齐放
随机推荐
【机器人坐标系第一讲】
【微信小程序】一文读懂小程序的生命周期和路由跳转
Excuse me, is the redis syntax used in DMS based on the commands of the redis community version of the cloud database
激动人心!2022开放原子全球开源峰会报名火热开启!
Bs-xx-042 implementation of personnel management system based on SSM
Iphone14 with pill screen may trigger a rush for Chinese consumers
编译libssh2报错找不到openssl
Wechat official account web page authorization login is so simple
WSL2.0安装
What else do you not know about new map()
Embedded-c Language-2
Deep dive kotlin synergy (XXI): flow life cycle function
Hiengine: comparable to the local cloud native memory database engine
[Jianzhi offer] 63 Maximum profit of stock
深潜Kotlin协程(二十一):Flow 生命周期函数
Embedded -arm (bare board development) -2
Allusions of King Xuan of Qi Dynasty
Sentinel flow guard
Writing method of twig array merging
Fleet tutorial 09 basic introduction to navigationrail (tutorial includes source code)