个人觉得 CMake 官网教程 Step6 对当前我们增加对 CMake 的了解作用不大,所以直接写了教程七。
现在,我们考虑在项目中添加一些代码,这些代码取决于目标平台可能没有的功能。对于这个例子,我们将添加一些代码,这取决于目标平台是否具有log
和 exp
函数。几乎每个平台都具有这两个函数,在这里我们仅是作为例子来说明本节的内容。
本节的目标是根据可用的系统依赖让编译器有选择性编译具体的实现代码。
需要编辑的文件:
MathFunctions/CMakeLists.txt
MathFunctions/mysqrt.cxx
本节使用的源代码是官网 Step7
目录下的文件。一开始我们需要编辑 MathFunctions/CMakeLists.txt
文件,包含 CheckCXXSourceCompiles
模块。之后,使用 check_cxx_source_compiles
确认 cmath
库当中的 log
和 exp
函数是否可用。如果它们可用,使用 target_compile_definitions()
指定 HAVE_LOG
和 HAVE_EXP
作为编译定义。
在 MathFunctions/mysqrt.cxx
文件中,包含 cmath
。之后,如果系统有 log
和 exp
函数,使用它们计算平方根。
首先,修改 MathFunctions/mysqrt.cxx
文件,在其中添加下面的指令:
include(CheckCXXSourceCompiles)
之后,使用 check_cxx_compiles_source
测试 log
和 exp
函数的可用性。此函数允许我们在编译真正的源代码之前,尝试编译具有所需依赖关系的简单代码。结果变量 HAVE_LOG
和 HAVE_EXP
表示这些依赖关系是否可用。继续修改 MathFunctions/CMakeLists.txt
文件,添加以下的内容:
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)
然后,需要传递这些 CMake 变量到源代码中。这样,源代码就能够分辨出哪些资源是可用的。如果 log
和 exp
函数都可用,使用指令 target_compile_definitions()
指定 HAVE_LOG
和 HAVE_EXP
作为 PRIVATE
的编译定义。继续修改 MathFunctions/CMakeLists.txt
文件,添加以下的内容:
if