在linux上使用gcc编译器时,我有一个使用命令行参数(一个参数)的C程序,比如./myprog0
我想写一个使用条件编译的makefile,这样如果我像make SPECIAL=1一样编译,那么就会使用命令行参数。如果我编译时没有特殊的,比如make,那么即使我们输入命令行参数,它也会被忽略。
如何让它成为可能。我正在使用下面的编译命令: gcc -o myprog mypro.c程序2.c程序3.c
发布于 2021-08-31 06:27:11
makefile可以是琐碎的,但真正的工作必须发生在C代码中。下面是一个最小的例子:
#include <stdio.h>
int main(int argc, char **argv, char **envp) {
int i;
#ifndef SPECIAL
argc=1;
argv[1] = NULL;
#endif
for(i=1; i<argc; ++i) {
printf(">>%s<<\n", argv[i]);
}
}现在,对于这个简单的程序,您甚至不需要Makefile。
bash$ make CFLAGS=-DSPECIAL=1 -f /dev/null myprog
cc -DSPECIAL=1 myprog.c -o myprog话虽如此,通过引入依赖于短暂的构建时突发奇想的变体来使您的构建具有不确定性,这是一种疯狂的秘诀。有两个单独的目标,这两个目标创建了两个独立的二进制文件,一个具有常规行为,另一个具有脚枪语义。
DEPS := myprog.c prog2.c prog3.c # or whatever your dependencies are
myprog: $(DEPS)
myprog-footgun: CLAGS+=-DSPECIAL=1
myprog-footgun: $(DEPS) # same dependencies, different output file
$(CC) $(CFLAGS) -o $@ $^有关此语法的详细信息,请参阅GNU Make文档中的Target-specific Variable Values。
(请注意,Stack Overflow将Markdown源代码中的选项卡呈现为空格,因此您将无法逐字复制/粘贴此内容。)
事实上,我可能会颠倒SPECIAL的含义,这样它就可以实现脚步枪版本,而不是反过来(这个答案的原始版本具有这种设计,只是因为我最初是以这种方式阅读您的问题的)。
https://stackoverflow.com/questions/68988136
复制相似问题