当前位置:网站首页>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?
边栏推荐
- Vulnerability recurrence - 48. Command injection in airflow DAG (cve-2020-11978)
- Server configuration jupyter environment
- LeetCode每日一题:合并两个有序数组
- flask接口响应中的中文乱码(unicode)处理
- 提高應用程序性能的7個DevOps實踐
- 较文心损失一点点性能提升很多
- C # mixed graphics and text, written to the database in binary mode
- Force deduction solution summary 1200 minimum absolute difference
- Knowledge points of MySQL (6)
- Summary of optimization scheme for implementing delay queue based on redis
猜你喜欢

Thesis reading_ Chinese NLP_ LTP

IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.

Machine learning 02: model evaluation

CVPR 2022 best student paper: single image estimation object pose estimation in 3D space

云主机oracle异常恢复----惜分飞

Oracle recovery tools -- Oracle database recovery tool

7. Scala class

十个顶级自动化和编排工具

Vulnerability recurrence - 48. Command injection in airflow DAG (cve-2020-11978)

MySQL之知识点(六)
随机推荐
VBA驱动SAP GUI实现办公自动化(二):判断元素是否存在
SQL Server(2)
MATLAB查阅
Why is all (()) true and any (()) false?
Oracle缩表空间的完整解决实例
Thesis reading_ Chinese NLP_ LTP
Winedt common shortcut key modify shortcut key latex compile button
Cartoon: interesting [pirate] question
BigDecimal除法的精度问题
Cartoon: looking for the k-th element of an unordered array (Revised)
Example tutorial of SQL deduplication
数据访问 - EntityFramework集成
外盘黄金哪个平台正规安全,怎么辨别?
ICML 2022 | Meta propose une méthode robuste d'optimisation bayésienne Multi - objectifs pour faire face efficacement au bruit d'entrée
解读:如何应对物联网目前面临的安全问题?
2022 information system management engineer examination outline
Cartoon: how to multiply large integers? (integrated version)
Debug kernel code through proc interface
十个顶级自动化和编排工具
Learn about MySQL transaction isolation level