关于cmake:CMake实战三自定义编译选项

5次阅读

共计 3647 个字符,预计需要花费 10 分钟才能阅读完成。


title: CMake 实战三:自定义编译选项

categories:[实战三]

tags:[CMake]

date: 2021/12/24

作者:hackett

微信公众号:加班猿


CMake 容许为我的项目减少编译选项,从而能够依据用户的环境和需要抉择最合适的编译计划。

很多开源库都会有 CMake 来进行治理编译,比方亚马逊 AWS 的 WebRTC 中的 CMake 外面有这么一行

option(USE_OPENSSL "Use openssl as crypto library" ON)

ON示意应用 openssl 的库,OFF示意不应用 openssl 的库

1、批改 CMakeLists 文件

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 我的项目信息
project (demo4)

# 退出一个配置头文件,用于解决 CMake 对源码的设置
configure_file ("${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

# 是否应用本人的 MathFunctions 库
option (USE_MYMATH "Use provided math implementation" ON)

# 是否退出 MathFunctions 库
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)  
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

# 查找当前目录下的所有源文件
# 并将名称保留到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成指标
add_executable(Demo ${DIR_SRCS})
target_link_libraries (demo  ${EXTRA_LIBS})

其中:

  1. configure_file 命令用于退出一个配置头文件 config.h,这个文件由 CMake 从 config.h.in 生成,通过这样的机制,将能够通过预约义一些参数和变量来控制代码的生成。
  2. option 命令增加了一个 USE_MYMATH 选项,并且默认值为 ON
  3. USE_MYMATH 变量的值来决定是否应用咱们本人编写的 MathFunctions 库。

2、批改 main.cpp 文件

让其依据 USE_MYMATH 的预约义值来决定是否调用规范库还是 MathFunctions 库:

#include <stdio.h>
#include <stdlib.h>
#include "config.h"

#ifdef USE_MYMATH
  #include "math/myMath.h"
#else
  #include <math.h>
#endif
int sub(int a, int b) {return (a - b);
}

int main(int argc, char *argv[]) {if (argc < 3){printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    int a = atof(argv[1]);
    int b = atoi(argv[2]);
    
#ifdef USE_MYMATH
    printf("Now we use our own Math library. \n");
    int result = add(a, b);
    printf("%d + %d = %d\n", a, b, result);
#else
    printf("Now we use the main.cpp sub function. \n");
    int result = sub(a, b);
    printf("%d - %d = %d\n", a, b, result);
#endif
    return 0;
}

3、编写 config.h.in 文件

下面的程序值得注意的是第 2 行,这里援用了一个 config.h 文件,这个文件预约义了 USE_MYMATH 的值。但咱们并不间接编写这个文件,为了不便从 CMakeLists.txt 中导入配置,咱们编写一个 config.h.in 文件,内容如下:

#cmakedefine USE_MYMATH

这样 CMake 会主动依据 CMakeLists 配置文件中的设置主动生成 config.h 文件。

4、编译我的项目

option (USE_MYMATH "Use provided math implementation" ON)

运行后果:

[root@hackett demo4]# cmake .
-- The C compiler identification is GNU 8.4.1
-- The CXX compiler identification is GNU 8.4.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/workspace/cmake/demo4
[root@hackett demo4]# cat config.h
#define USE_MYMATH
[root@hackett demo4]# make
Consolidate compiler generated dependencies of target MathFunctions
[50%] Built target MathFunctions
Consolidate compiler generated dependencies of target demo
[75%] Building CXX object CMakeFiles/demo.dir/main.cpp.o
[100%] Linking CXX executable demo
[100%] Built target demo
[root@hackett demo4]# ./demo 3 2
Now we use our own Math library. 
3 + 2 = 5

option (USE_MYMATH "Use provided math implementation" OFF)

运行后果:

[root@hackett demo4]# cmake .
-- The C compiler identification is GNU 8.4.1
-- The CXX compiler identification is GNU 8.4.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/workspace/cmake/demo4
[root@hackett demo4]# cat config.h
/* #undef USE_MYMATH */
[root@hackett demo4]# make
[50%] Building CXX object CMakeFiles/demo.dir/main.cpp.o
[100%] Linking CXX executable demo
[100%] Built target demo
[root@hackett demo4]# ./demo  3 2
Now we use the main.cpp sub function. 
3 - 2 = 1

如果你感觉文章还不错,能够给个 ”三连 “,文章同步到集体微信公众号[ 加班猿]

我是hackett,咱们下期见

参考文档:

CMake 入门实战

CMake Tutorial

正文完
 0