自定义编译选项

CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案。

例如,可以将 MathFunctions 库设为一个可选库,如果该选项为 ON ,就使用该库定义的数学函数来进行运算。否则就调用标准库中的数学函数库。

修改 CMakeLists 文件

我们要做的第一步是在顶层的 CMakeLists.txt 文件中添加该选项:

  1. # CMake 最低版本号要求
  2. cmake_minimum_required (VERSION 2.8)
  3. # 项目信息
  4. project (Demo4)
  5. # 加入一个配置头文件,用于处理 CMake 对源码的设置
  6. configure_file (
  7. "${PROJECT_SOURCE_DIR}/config.h.in"
  8. "${PROJECT_BINARY_DIR}/config.h"
  9. )
  10. # 是否使用自己的 MathFunctions 库
  11. option (USE_MYMATH
  12. "Use provided math implementation" ON)
  13. # 是否加入 MathFunctions 库
  14. if (USE_MYMATH)
  15. include_directories ("${PROJECT_SOURCE_DIR}/math")
  16. add_subdirectory (math)
  17. set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
  18. endif (USE_MYMATH)
  19. # 查找当前目录下的所有源文件
  20. # 并将名称保存到 DIR_SRCS 变量
  21. aux_source_directory(. DIR_SRCS)
  22. # 指定生成目标
  23. add_executable(Demo ${DIR_SRCS})
  1. # 添加链接库
  1. target_link_libraries (Demo ${EXTRA_LIBS})

其中:

  1. configure_file 命令用于加入一个配置头文件 config.h ,这个文件由 CMake 从 config.h.in 生成,通过这样的机制,将可以通过预定义一些参数和变量来控制代码的生成。
  2. option 命令添加了一个 USE_MYMATH 选项,并且默认值为 ON
  3. USE_MYMATH 变量的值决定是否使用我们自己编写的 MathFunctions 库。
修改 main.cc 文件

之后修改 main.cc 文件,让其根据 USE_MYMATH 的预定义值来决定是否调用标准库还是 MathFunctions 库:

  1. #include
  2. #include
  3. #include

"config.h"

  1. #ifdef USE_MYMATH
  2. #include "math/MathFunctions.h"
  3. #else
  4. #include
  5. #endif
  1. int main(int argc, char *argv[])
  2. {
  3. if (argc < ){
  4. printf("Usage: %s base exponent \n", argv[]);
  5. return ;
  6. }
  7. double base = atof(argv[]);// Convert string to float
  8. int exponent = atoi(argv[]); // Convert string to integer
  1. #ifdef USE_MYMATH
  2. printf("Now we use our own Math library. \n");
  3. double result = power(base, exponent);
  4. #else
  5. printf("Now we use the standard library. \n");
  6. double result = pow(base, exponent);
  7. #endif
  1. printf("%g ^ %d is %g\n", base, exponent, result);
  2. return ;
  3. }
编写 config.h.in 文件

上面的程序值得注意的是,这里引用了一个 config.h 文件,这个文件预定义了 USE_MYMATH 的值。但我们并不直接编写这个文件,为了方便从 CMakeLists.txt 中导入配置,我们编写一个 config.h.in 文件,内容如下:

  1. #cmakedefine USE_MYMATH

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

参考文档http://www.cmake.org/cmake-tutorial/

这里有更加完整的中文版,感谢大神!!:

http://www.cnblogs.com/coderfenghc/archive/2013/01/20/2846621.html#3176055

CMake 自定义编译选项的更多相关文章

  1. cmake常用编译选项

    1.openmp加载,cmake3.9之后内置了openmp find_package(OpenMP) if (OPENMP_FOUND OR OpenMP_CXX_FOUND) set (CMAKE ...

  2. 构建编译TVM方法

    构建编译TVM方法 本文提供如何在各种系统上构建和安装TVM包的说明.它包括两个步骤: 1.     首先从C代码构建共享库( libtvm.so for linux, libtvm.dylib fo ...

  3. CMake入门-04-自定义编译选项

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! - 自定义编译选项 CMake 允许为项目增加编译选项,从而可以 ...

  4. CMake 教程

    CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多. 介绍:http://baike.baidu.com/view/1126160.htm 本文件不介绍CMake的基本语法, ...

  5. cmake 常用变量和常用环境变量查表手册---整理 .

    一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种 ...

  6. CMake使用总结(转的)+自己的实践心得

    来自https://www.mawenbao.com/note/cmake.html 总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform make,可用 ...

  7. cmake 常用变量和常用环境变量查表手册

    cmake 常用变量和常用环境变量查表手册 一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定 ...

  8. 在 linux 下使用 CMake 构建应用程序

    学习cmake http://xwz.me/wiki/doku.php?id=cmake 碰到的一些问题: 1.You have changed variables that require your ...

  9. CMake使用总结【转】

    本文转载自:https://www.mawenbao.com/note/cmake.html 总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform mak ...

随机推荐

  1. poj 1952 最长公共子序列计数

    看代码就懂了  不解释  3 1 1 1 1 2 2 2 1 1 1 3  第一个3 和最后一个 3 只需要一个就够了,,, #include<iostream> #include< ...

  2. 【java规则引擎】一个基于drools规则引擎实现的数学计算例子

    最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎 ...

  3. 十、python沉淀之路--高阶函数初识

    一.高阶函数:分两种:一种是返回值中包含函数体:另一种是把一个函数体当作了参数传给了另一个函数 1.返回值中包含函数体 例1. def test(): print('这是一个测试') return t ...

  4. gogs docker 安装

     1.  gogs 镜像      docker pull gogs/gogs    2.  mysql    docker mysql    3.  本地数据卷配置 mkdir gogs & ...

  5. 学习动态性能表(1)--v$sysstat

    由动态性能表学到的 第一篇--v$sysstat  2007.5.23 按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wid ...

  6. Oracle事务的隔离

    事务是指一些列操作的集合,它有4个属性:原子性(Automacity).一致性(Consistency).隔离性(Isolation)和持久性(Durability),这4个属性简称为ACID.原子性 ...

  7. 大数据竞赛平台——Kaggle 入门篇

    这篇文章适合那些刚接触Kaggle.想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文.本文分为两部分介绍Kaggle,第一部分简 ...

  8. 分布式锁之三:Redlock实现分布式锁

    之前写过一篇文章<如何在springcloud分布式系统中实现分布式锁?>,由于自己仅仅是阅读了相关的书籍,和查阅了相关的资料,就认为那样的是可行的.那篇文章实现的大概思路是用setNx命 ...

  9. Pycharm快速复制当前行到下一行Ctrl+D

    Pycharm快速复制当前行到下一行Ctrl+D

  10. Spring MVC启动时初始化的几个常用方法

    Spring-MVC的应用中,要实现类似的功能,主要是通过实现下面这些接口(任选一,至少一个即可) 一.ApplicationContextAware接口 +? 1 2 3 4 5 6 7 8 9 p ...