CMake 自定义编译选项
自定义编译选项
CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案。
例如,可以将 MathFunctions 库设为一个可选库,如果该选项为 ON
,就使用该库定义的数学函数来进行运算。否则就调用标准库中的数学函数库。
修改 CMakeLists 文件
我们要做的第一步是在顶层的 CMakeLists.txt 文件中添加该选项:
- # 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})
其中:
configure_file
命令用于加入一个配置头文件 config.h ,这个文件由 CMake 从 config.h.in 生成,通过这样的机制,将可以通过预定义一些参数和变量来控制代码的生成。option
命令添加了一个USE_MYMATH
选项,并且默认值为ON
。USE_MYMATH
变量的值决定是否使用我们自己编写的 MathFunctions 库。
修改 main.cc 文件
之后修改 main.cc 文件,让其根据 USE_MYMATH
的预定义值来决定是否调用标准库还是 MathFunctions 库:
- #include
- #include
- #include
"config.h"
- #ifdef USE_MYMATH
- #include "math/MathFunctions.h"
- #else
- #include
- #endif
- int main(int argc, char *argv[])
- {
- if (argc < ){
- printf("Usage: %s base exponent \n", argv[]);
- return ;
- }
- double base = atof(argv[]);// Convert string to float
- int exponent = atoi(argv[]); // Convert string to integer
- #ifdef USE_MYMATH
- printf("Now we use our own Math library. \n");
- double result = power(base, exponent);
- #else
- printf("Now we use the standard library. \n");
- double result = pow(base, exponent);
- #endif
- printf("%g ^ %d is %g\n", base, exponent, result);
- return ;
- }
编写 config.h.in 文件
上面的程序值得注意的是,这里引用了一个 config.h 文件,这个文件预定义了 USE_MYMATH
的值。但我们并不直接编写这个文件,为了方便从 CMakeLists.txt 中导入配置,我们编写一个 config.h.in 文件,内容如下:
- #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 自定义编译选项的更多相关文章
- cmake常用编译选项
1.openmp加载,cmake3.9之后内置了openmp find_package(OpenMP) if (OPENMP_FOUND OR OpenMP_CXX_FOUND) set (CMAKE ...
- 构建编译TVM方法
构建编译TVM方法 本文提供如何在各种系统上构建和安装TVM包的说明.它包括两个步骤: 1. 首先从C代码构建共享库( libtvm.so for linux, libtvm.dylib fo ...
- CMake入门-04-自定义编译选项
工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! - 自定义编译选项 CMake 允许为项目增加编译选项,从而可以 ...
- CMake 教程
CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多. 介绍:http://baike.baidu.com/view/1126160.htm 本文件不介绍CMake的基本语法, ...
- cmake 常用变量和常用环境变量查表手册---整理 .
一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种 ...
- CMake使用总结(转的)+自己的实践心得
来自https://www.mawenbao.com/note/cmake.html 总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform make,可用 ...
- cmake 常用变量和常用环境变量查表手册
cmake 常用变量和常用环境变量查表手册 一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定 ...
- 在 linux 下使用 CMake 构建应用程序
学习cmake http://xwz.me/wiki/doku.php?id=cmake 碰到的一些问题: 1.You have changed variables that require your ...
- CMake使用总结【转】
本文转载自:https://www.mawenbao.com/note/cmake.html 总结CMake的常用命令,并介绍有用的CMake资源. CMake意为cross-platform mak ...
随机推荐
- poj 1952 最长公共子序列计数
看代码就懂了 不解释 3 1 1 1 1 2 2 2 1 1 1 3 第一个3 和最后一个 3 只需要一个就够了,,, #include<iostream> #include< ...
- 【java规则引擎】一个基于drools规则引擎实现的数学计算例子
最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎 ...
- 十、python沉淀之路--高阶函数初识
一.高阶函数:分两种:一种是返回值中包含函数体:另一种是把一个函数体当作了参数传给了另一个函数 1.返回值中包含函数体 例1. def test(): print('这是一个测试') return t ...
- gogs docker 安装
1. gogs 镜像 docker pull gogs/gogs 2. mysql docker mysql 3. 本地数据卷配置 mkdir gogs & ...
- 学习动态性能表(1)--v$sysstat
由动态性能表学到的 第一篇--v$sysstat 2007.5.23 按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wid ...
- Oracle事务的隔离
事务是指一些列操作的集合,它有4个属性:原子性(Automacity).一致性(Consistency).隔离性(Isolation)和持久性(Durability),这4个属性简称为ACID.原子性 ...
- 大数据竞赛平台——Kaggle 入门篇
这篇文章适合那些刚接触Kaggle.想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文.本文分为两部分介绍Kaggle,第一部分简 ...
- 分布式锁之三:Redlock实现分布式锁
之前写过一篇文章<如何在springcloud分布式系统中实现分布式锁?>,由于自己仅仅是阅读了相关的书籍,和查阅了相关的资料,就认为那样的是可行的.那篇文章实现的大概思路是用setNx命 ...
- Pycharm快速复制当前行到下一行Ctrl+D
Pycharm快速复制当前行到下一行Ctrl+D
- Spring MVC启动时初始化的几个常用方法
Spring-MVC的应用中,要实现类似的功能,主要是通过实现下面这些接口(任选一,至少一个即可) 一.ApplicationContextAware接口 +? 1 2 3 4 5 6 7 8 9 p ...