CMake教程(七):添加系统检查

个人觉得 CMake 官网教程 Step6 对当前我们增加对 CMake 的了解作用不大,所以直接写了教程七。

现在,我们考虑在项目中添加一些代码,这些代码取决于目标平台可能没有的功能。对于这个例子,我们将添加一些代码,这取决于目标平台是否具有logexp 函数。几乎每个平台都具有这两个函数,在这里我们仅是作为例子来说明本节的内容。

本节的目标是根据可用的系统依赖让编译器有选择性编译具体的实现代码。

需要编辑的文件:

  • MathFunctions/CMakeLists.txt
  • MathFunctions/mysqrt.cxx

本节使用的源代码是官网 Step7 目录下的文件。一开始我们需要编辑 MathFunctions/CMakeLists.txt 文件,包含 CheckCXXSourceCompiles 模块。之后,使用 check_cxx_source_compiles 确认 cmath 库当中的 logexp 函数是否可用。如果它们可用,使用 target_compile_definitions() 指定 HAVE_LOGHAVE_EXP 作为编译定义。

MathFunctions/mysqrt.cxx 文件中,包含 cmath。之后,如果系统有 logexp 函数,使用它们计算平方根。

首先,修改 MathFunctions/mysqrt.cxx 文件,在其中添加下面的指令:
include(CheckCXXSourceCompiles)

之后,使用 check_cxx_compiles_source 测试 logexp 函数的可用性。此函数允许我们在编译真正的源代码之前,尝试编译具有所需依赖关系的简单代码。结果变量 HAVE_LOGHAVE_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 变量到源代码中。这样,源代码就能够分辨出哪些资源是可用的。如果 logexp 函数都可用,使用指令 target_compile_definitions() 指定 HAVE_LOGHAVE_EXP 作为 PRIVATE 的编译定义。继续修改 MathFunctions/CMakeLists.txt 文件,添加以下的内容:

 if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值