从 Makefile 覆盖宏常量
Posted
技术标签:
【中文标题】从 Makefile 覆盖宏常量【英文标题】:Overwrite a macro constant from a Makefile 【发布时间】:2017-01-03 06:39:36 【问题描述】:是否可以用 Makefile 中的另一个值覆盖宏?
假设我有一个文件a.c
和一个Makefile
。
在a.c
文件中,我将宏声明为#define DEBUG 1
。
我想将值从Makefile
替换为CCFLAGS += -D DEBUG -Dvar=1
。但是,如果我这样做,我会收到 redefine 警告,并且该值将保持在 a.c
中使用的值。
这可能吗?还有,这是不好的做法吗?
【问题讨论】:
【参考方案1】:您需要自己修改宏定义:
#ifndef DEBUG
# define DEBUG 1
#endif
或者只是完全删除定义,并始终从构建系统传递值。
【讨论】:
【参考方案2】:这可能吗?
不可能通过像-DFOO=bar
这样的标志,因为命令行中的宏定义在源代码文件中的之前,因此将被覆盖(重新定义)。
但是,如果您打算通过编译器标志控制宏值,您可能会发现 ifndef
指令很有帮助。例如:
[pengyu@GLaDOS-Precision-7510 tmp]$ cat a.c
#ifndef TEST
# define TEST 1
#endif
TEST
[pengyu@GLaDOS-Precision-7510 tmp]$ cpp a.c
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "a.c"
1
[pengyu@GLaDOS-Precision-7510 tmp]$ cpp a.c -DTEST=2
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "a.c"
2
【讨论】:
以上是关于从 Makefile 覆盖宏常量的主要内容,如果未能解决你的问题,请参考以下文章
在 makefile 中为 Visual Studio C++ 构建定义宏