构建c/c++项目时添加宏定义
2016-04-04 21:22
337 查看
有时候我们希望在构建时能够在命令行添加一些宏定义,改变程序行为。一个典型应用示例是代码里通过检查是否定义了
gcc 时可以在命令行添加
不过,大型项目一般都需要自动化构建工具,如 GNU Autotools 或者 CMake。使用它们后,我们无法直接修改编译命令,但它们提供了替代方案。对于 Autotools,它可以识别
此外,我们还可以先
CPP 指的是 C 预处理器 (C Preprocessor),不是 C++,其中只应该设置
支持
C 编译链接时、C++ 编译链接时、以及仅在链接时有效的选项。
目前许多项目已经使用 CMake 来构建。CMake 支持
会无视
CMake 中标准的添加宏定义方法是使用
CMake 选项:
然后做一个条件判断:
之后,就可以用
最后值得一提的是,如果代码里已经有了宏定义语句,那么通过命令行修改其取值是 不可能 的。编译器会警告宏被重复定义,而且生效的是源文件中的定义。想要重新定义,只能随后
DEBUG宏,来决定是否输出调试信息。编译器一般提供命令行选项支持这种做法,例如使用
gcc 时可以在命令行添加
-D选项,定义一些宏:
gcc -DDEBUG=1 a.c
不过,大型项目一般都需要自动化构建工具,如 GNU Autotools 或者 CMake。使用它们后,我们无法直接修改编译命令,但它们提供了替代方案。对于 Autotools,它可以识别
CPPFLAGS等环境变量,从而我们可以在命令行上添加宏定义,例如:
CPPFLAGS="-DDEBUG=1" ./configure
此外,我们还可以先
export CPPFLAGS="-DDEBUG=1",再用
./configure命令。注意这里
CPPFLAGS的
CPP 指的是 C 预处理器 (C Preprocessor),不是 C++,其中只应该设置
-I、
-D、
-U等影响预处理器的选项。Autotools
支持
CFLAGS、
CXXFLAGS、
LDFLAGS环境变量,分别用来指定
C 编译链接时、C++ 编译链接时、以及仅在链接时有效的选项。
目前许多项目已经使用 CMake 来构建。CMake 支持
CFLAGS、
CXXFLAGS、
LDFLAGS等,但遗憾的是唯独不支持
CPPFLAGS。也就是说,CMake
会无视
CPPFLAGS环境变量的值。Aron Xu 为此报了一个 BUG ,不过因为没人志愿去做,所以一直没有修复。许多人可能会以为,可以用类似
cmake .. -DVAR=VALUE的方式来添加宏定义,但这是 无效 的。这样一来,如果想在命令行上指定宏定义,只能复用
CFLAGS或者
CXXFLAGS变量。这基本可以工作,因为一般情况下预处理和编译是同一个命令进行的。
CMake 中标准的添加宏定义方法是使用
ADD_DEFINITIONS(-DMACRO)(参考 文档 ),不过这需要修改
CMakeLists.txt文件。如果想要在命令行上定制宏的开关或取值,那么可以像 这里 一样,定义一个
CMake 选项:
OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default
然后做一个条件判断:
IF(DEFINE_MACRO) ADD_DEFINITIONS(-DMACRO) ENDIF(DEFINE_MACRO)
之后,就可以用
cmake -DDEFINE_MACRO=OFF ..调整宏的开关或取值了。
最后值得一提的是,如果代码里已经有了宏定义语句,那么通过命令行修改其取值是 不可能 的。编译器会警告宏被重复定义,而且生效的是源文件中的定义。想要重新定义,只能随后
#undef再
#define。这将不得不通过修改代码来实现。
相关文章推荐
- c++中使用外部库exe,.dll与.lib文件的生成与使用的详解
- 中兴移动2014届校园招聘C++笔试题
- C++两个不同类之间,友元函数的简单应用。
- c++ 转换构造函数
- Move semantics(C++11)
- 大型分布式C++框架《一:框架简介》
- C语言问卷调查
- 设计模式C++策略模式
- 【C++】深拷贝和浅拷贝解析
- c++作业2---项目二到四
- C++多文件中全局变量的声明与定义
- C++ 枚举
- c++细节总结链接
- 【day0404】C++ 内联函数inline
- C++虚函数、虚函数的作用和使用方法
- 设计模式C++桥接模式
- C++ 自定义比较:仿函数、函数与重载操作符
- 递归算法以及C语言实例分析
- C++运算符重载及友元函数-练习题
- C++之类的内存分配问题