美文网首页LinuxLinux学习之路
CMake教程读书笔记-第四步,添加系统相关特性

CMake教程读书笔记-第四步,添加系统相关特性

作者: QuietHeart | 来源:发表于2020-11-17 20:48 被阅读0次

    第四步,添加系统相关特性

    相关代码:4_system

    下面,我们考虑为我们的项目添加一些代码,这些代码所依赖的特性可能在目标平台上是没有的。

    对于这个例子,我们将加入一些代码,这些代码依赖的是:目标平台是否具有 logexp 函数。当然,几乎所有的平台都有这些函数,但是在这个教程中,我们假设它们是不通用的。

    如果平台具有 logexp ,那么我们就在程序中使用 logexp

    编辑项目文件 CMakeLists.txt

    我们首先通过在顶级 CMakeLists.txt 中使用 CheckSymbolExists . cmake 宏检测这些函数的可用性,如下:

    # does this system provide the log and exp functions?
    include(CheckSymbolExists)
    set(CMAKE_REQUIRED_LIBRARIES "m")
    check_symbol_exists(log "math.h" HAVE_LOG)
    check_symbol_exists(exp "math.h" HAVE_EXP)
    
    message("Begin!")
    if (HAVE_LOG AND HAVE_EXP)
            message("Have, have have!")
    #       add_definitions(-DHAVE_LOG)
    #       add_definitions(-DHAVE_EXP)
    endif (HAVE_LOG AND HAVE_EXP)
    message("End!")
    

    注意

    1. 不知为何,有时 #if(HAVE_LOG AND HAVE_EXP) 为真,有时为假,确保这个变量的话,可以用 "cmake -DHAVE_LOG=ON -DHAVE_EXP=ON tutorial" 来调试。
    2. logexp 的测试要在用于 TutorialConfig.hconfigure_file 命令之前进行。 configure_file 命令会根据当前在 CMake 中的设置立即对文件进行配置。
    3. 使用 set(CMAKE_REQUIRED_LIBRARIES "m") 设置后,再进行检测否则可能会有问题。

    编辑配置文件 TutorialConfig.h.in

    接下来,我们修改 TutorialConfig.h.in 来定义哪些值以便 CMake 在平台上查找,如下:

    // does the platform provide exp and log functions?
    #cmakedefine HAVE_LOG
    #cmakedefine HAVE_EXP
    

    注意:

    • 前面 CMakeLists.txt 中的 add_definitions(...) 与这里的 #cmakedefine ... 是相互冲突的,不能同时存在,保留一个即可。

    编辑代码文件 main.cpp

    我们通过下述代码,可以在 logexp 在系统中可用的时候,基于这两个函数提供一个可选的实现,如下:

    // if we have both log and exp then use them
    #if defined (HAVE_LOG) && defined (HAVE_EXP)
      fprintf(stdout, "Result of exp(log(0.5))is:%ld\n", exp(log(0.5)));
    #else // otherwise use an iterative approach
      fprintf(stdout, "Don't support exp and log\n");
    #endif
    

    执行

    $cmake -S tutorial -B build
    $cmake --build build
    $./build/Tutorial 
    ./build/Tutorial Version 1.0
    Usage: ./build/Tutorial number
    $./build/Tutorial 25
    Result of exp(log(0.5))is:4627730092099895296
    custom square root.
    The square root of 25 is 0
    

    注意,第一条命令 -S 指定源码目录, -B 指定生成的编译目录。 第二条命令 --build 指明到 build 目录中编译,相当于 cd build && make

    相关文章

      网友评论

        本文标题:CMake教程读书笔记-第四步,添加系统相关特性

        本文链接:https://www.haomeiwen.com/subject/bggebktx.html