C make命令替换代码中的常量

C make命令替换代码中的常量,c,unix,makefile,C,Unix,Makefile,很抱歉,如果这是一个原始的问题,但我真的是linux新手。在使用make命令构建应用程序时,是否有方法替换源代码中的常量 我知道下一个可能的方法是更改源代码中使用的头文件,但我这样做是因为我必须对多个微控制器进行编程,每个微控制器都应该有一个唯一的整数作为其编号(该编号在代码中被指定为常量) 任何提示都将不胜感激 调用编译器时,通常通过定义预处理器宏来完成,例如: # Makefile NUMBER := 42 %.o : %.c gcc -c -o $@ ${CPPFLAGS} ${C

很抱歉,如果这是一个原始的问题,但我真的是linux新手。在使用
make
命令构建应用程序时,是否有方法替换源代码中的常量

我知道下一个可能的方法是更改源代码中使用的头文件,但我这样做是因为我必须对多个微控制器进行编程,每个微控制器都应该有一个唯一的整数作为其编号(该编号在代码中被指定为常量)


任何提示都将不胜感激

调用编译器时,通常通过定义预处理器宏来完成,例如:

# Makefile
NUMBER := 42
%.o : %.c
    gcc -c -o $@ ${CPPFLAGS} ${CFLAGS} -DNUMBER=${NUMBER} $<

调用编译器时,通常通过定义预处理器宏来完成,例如:

# Makefile
NUMBER := 42
%.o : %.c
    gcc -c -o $@ ${CPPFLAGS} ${CFLAGS} -DNUMBER=${NUMBER} $<
可以使用通过命令行传递给编译器的C语言宏。通常的
Makefile
代码片段看起来像

CFLAGS = -DVERSION_INT=42 -DVERSION_STRING=\"Frobozz Magic Frobnicator (TM)\"

main: main.c
         $(CC) $(CFLAGS) -o $@ main.c
总的来说,你可能有

static int version = VERSION_INT;
static char vers[] = VERSION_STRING;
可以使用通过命令行传递给编译器的C语言宏。通常的
Makefile
代码片段看起来像

CFLAGS = -DVERSION_INT=42 -DVERSION_STRING=\"Frobozz Magic Frobnicator (TM)\"

main: main.c
         $(CC) $(CFLAGS) -o $@ main.c
总的来说,你可能有

static int version = VERSION_INT;
static char vers[] = VERSION_STRING;

你应该看看sed和grep,它们提供了你所需要的功能,或者如果你的源代码正被C预处理器处理,用
make-Dconstant=value
传入一个合适的
#define
。你应该看看sed和grep,它们提供了您所需的功能。如果您的源代码正由C预处理器处理,请使用
make-Dconstant=value
传入合适的
#define
。避免重新定义隐式规则几乎总是更好的。一行Makefile就足够了:
cppfaligs=-DNUMBER=N
(也许还有第二行:
all:foo
,这样用户就可以简单地键入
make
而不是
make foo
)@willampersell:我同意
-D…
应该放在
cppfaligs
中。我更喜欢禁用我自己的makefile的所有内置规则,因为它们对我来说不够好。例如,我喜欢在makefile更改时触发重新编译,因此我的对象文件也依赖于它们的makefile。一行Makefile就足够了:
cppfaligs=-DNUMBER=N
(也许还有第二行:
all:foo
,这样用户就可以简单地键入
make
而不是
make foo
)@willampersell:我同意
-D…
应该放在
cppfaligs
中。我更喜欢禁用我自己的makefile的所有内置规则,因为它们对我来说不够好。例如,我喜欢在makefiles发生更改时触发重新编译,因此我的对象文件也依赖于它们的makefile。
-D
选项用于预处理器,属于
CPPFLAGS
而不是
CFLAGS
@williampersell我不同意
CPPFLAGS
或多或少是J.random Hacker的一项随机发明
CFLAGS
是POSIX的方式,我非常重视可移植性。但任何人的MMV.:-)有趣的令人惊讶的是,要将长期存在的惯例与实际标准区分开来是非常困难的。谢谢你指出这一点
-D
选项用于前置处理器,属于
CPPFLAGS
而不是
CFLAGS
@williampersell我不同意
CPPFLAGS
或多或少是J.random Hacker的一项随机发明
CFLAGS
是POSIX的方式,我非常重视可移植性。但任何人的MMV.:-)有趣的令人惊讶的是,要将长期存在的惯例与实际标准区分开来是非常困难的。谢谢你指出这一点!