当前位置:网站首页>Cmake tutorial step5 (add system self-test)
Cmake tutorial step5 (add system self-test)
2022-07-05 17:45:00 【It's beginning to boil】
CMake Official documents
Refer to the official cmake3.24 Course translation . I'm going to use cmake 3.16 To demonstrate examples .
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
My warehouse :
https://github.com/FRBoiling/cmake-tutorial.git
Let's consider adding some code to the project that depends on features that the target platform may not have .
For this example , We will add some that depend on whether the target platform has log and exp Function code . Of course , Almost every platform has these functions , But assume in this tutorial that they are not common .
If the platform has log and exp, Then we will use them in mysqrt Calculate the square root in the function .
We use MathFunctions/CMakeLists.txt Medium CheckCXXSourceCompiles Module to test the usability of these functions .
Calling target_include_directories() after , take log and exp The check of is added to 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)
If available , Use target_compile_definitions() take HAVE_LOG and HAVE_EXP Specify private compilation definitions .
if(HAVE_LOG AND HAVE_EXP)
target_compile_definitions(MathFunctions
PRIVATE "HAVE_LOG" "HAVE_EXP")
endif()
If log and exp Available on the system , Then we will use them in mysqrt Calculate the square root in the function . Add the following code to math_functions/mysqrt.cxx Medium mysqrt Function ( Don't forget before returning the result #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;
We still need to revise it mysqrt.cxx contain cmath The header file .
#include <cmath>
Come here ,mysqrt.cxx The content is long like this :
#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;
}
function cmake Executable or cmake-gui To configure the project , Then build it using the build tool of your choice , And run the tutorial executable .
test
Now which function gives a better result ,sqrt still mysqrt?
边栏推荐
- 2022 information system management engineer examination outline
- WR | Jufeng group of West Lake University revealed the impact of microplastics pollution on the flora and denitrification function of constructed wetlands
- 一文读懂简单查询代价估算
- Tita performance treasure: how to prepare for the mid year examination?
- 忽米沄析:工业互联网标识解析与企业信息系统的融合应用
- Summary of optimization scheme for implementing delay queue based on redis
- 一口气读懂 IT发展史
- 33: Chapter 3: develop pass service: 16: use redis to cache user information; (to reduce the pressure on the database)
- Domain name resolution, reverse domain name resolution nbtstat
- Debug kernel code through proc interface
猜你喜欢
每日一练:关于日期的一系列
IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
MATLAB查阅
深入理解Redis内存淘汰策略
7. Scala class
33: Chapter 3: develop pass service: 16: use redis to cache user information; (to reduce the pressure on the database)
MySQL之知识点(六)
ICML 2022 | meta proposes a robust multi-objective Bayesian optimization method to effectively deal with input noise
Complete solution instance of Oracle shrink table space
查看自己电脑连接过的WiFi密码
随机推荐
如何修改mysql字段为自增长字段
mongodb(快速上手)(一)
力扣解法汇总1200-最小绝对差
MySQL之知识点(七)
Cartoon: interesting [pirate] question
毫无章法系列
C (WinForm) the current thread is not in a single threaded unit, so ActiveX controls cannot be instantiated
求解为啥all(())是True, 而any(())是FALSE?
WebApp开发-Google官方教程
Understand the usage of functions and methods in go language
C # mixed graphics and text, written to the database in binary mode
Oracle recovery tools -- Oracle database recovery tool
Summary of optimization scheme for implementing delay queue based on redis
QT控制台打印输出
排错-关于clion not found visual studio 的问题
Read libco save and restore the on-site assembly code
论文阅读_中文NLP_LTP
一口气读懂 IT发展史
CVPR 2022 best student paper: single image estimation object pose estimation in 3D space
Complete solution instance of Oracle shrink table space