谷歌翻译
步骤 7:添加系统自检
让我们考虑在项目中添加一些依赖于目标平台可能没有的功能的代码。在这个例子中,我们将添加一些依赖于目标平台是否具有log和exp 功能的代码。当然,几乎每个平台都有这些功能,但在本教程中,假设它们并不常见。
练习 1 - 评估依赖可用性
目标
根据可用的系统依赖关系改变实现。
有用的资源
CheckCXXSourceCompiles
target_compile_definitions()
要编辑的文件
MathFunctions/CMakeLists.txt
MathFunctions/mysqrt.cxx
入门
目录中提供了起始源代码Step7。在此练习中,完成。TODO 1TODO 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,则使用它们来计算平方根。
构建并运行
创建一个名为的新目录Step7_build。运行 cmake可执行文件或 cmake-gui配置项目,然后使用您选择的构建工具构建它并运行Tutorial可执行文件。
看起来如下:
mkdir Step7_build
cd Step7_build
cmake …/Step7
cmake --build .
哪个函数现在能给出更好的结果,sqrt或者mysqrt?
解决方案
在本练习中,我们将使用 CheckCXXSourceCompiles模块所以首先我们必须将其包含在内 MathFunctions/CMakeLists.txt。
TODO 1:单击显示/隐藏答案
TODO 1:MathFunctions/CMakeLists.txt
include(CheckCXXSourceCompiles)
然后使用测试log和的可用性 。此函数让我们在真正的源代码编译之前尝试编译具有所需依赖项的简单代码。结果变量 和表示这些依赖项是否可用。expcheck_cxx_compiles_sourceHAVE_LOGHAVE_EXP
TODO 2:单击显示/隐藏答案
TODO 2:MathFunctions/CMakeLists.txt
check_cxx_source_compiles("
#include
int main() {
std::log(1.0);
return 0;
}
" HAVE_LOG)
check_cxx_source_compiles("
#include
int main() {
std::exp(1.0);
return 0;
}
" HAVE_EXP)
接下来,我们需要将这些 CMake 变量传递给我们的源代码。这样,我们的源代码就可以知道哪些资源可用。如果和都log可用 exp,请使用target_compile_definitions()指定 HAVE_LOG并HAVE_EXP编译PRIVATE定义。
TODO 3:单击显示/隐藏答案
TODO 3:MathFunctions/CMakeLists.txt
if(HAVE_LOG AND HAVE_EXP)
target_compile_definitions(SqrtLibrary
PRIVATE “HAVE_LOG” “HAVE_EXP”
)
endif()
target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()
由于我们可能使用log和exp,因此我们需要修改 mysqrt.cxx以包括cmath。
TODO 4:单击显示/隐藏答案
TODO 4:MathFunctions/mysqrt.cxx
#include
如果系统中有log和exp,则使用它们来计算函数中的平方根mysqrt。mysqrt中的函数 MathFunctions/mysqrt.cxx将如下所示:
TODO 5:单击显示/隐藏答案
TODO 5:MathFunctions/mysqrt.cxx
#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