首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >makefile中的条件编译,以便忽略命令行参数

问makefile中的条件编译,以便忽略命令行参数
EN

Stack Overflow用户
提问于 2021-08-30 17:29:08
回答 1查看 127关注 0票数 0

在linux上使用gcc编译器时,我有一个使用命令行参数(一个参数)的C程序,比如./myprog0

我想写一个使用条件编译的makefile,这样如果我像make SPECIAL=1一样编译,那么就会使用命令行参数。如果我编译时没有特殊的,比如make,那么即使我们输入命令行参数,它也会被忽略。

如何让它成为可能。我正在使用下面的编译命令: gcc -o myprog mypro.c程序2.c程序3.c

EN

回答 1

Stack Overflow用户

发布于 2021-08-31 06:27:11

makefile可以是琐碎的,但真正的工作必须发生在C代码中。下面是一个最小的例子:

代码语言:javascript
复制
#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。

代码语言:javascript
复制
bash$ make CFLAGS=-DSPECIAL=1 -f /dev/null myprog
cc -DSPECIAL=1     myprog.c   -o myprog

话虽如此,通过引入依赖于短暂的构建时突发奇想的变体来使您的构建具有不确定性,这是一种疯狂的秘诀。有两个单独的目标,这两个目标创建了两个独立的二进制文件,一个具有常规行为,另一个具有脚枪语义。

代码语言:javascript
复制
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的含义,这样它就可以实现脚步枪版本,而不是反过来(这个答案的原始版本具有这种设计,只是因为我最初是以这种方式阅读您的问题的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68988136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档