【问题标题】:conditional compilation in makefile so that command-line arguments are ignoredmakefile 中的条件编译,以便忽略命令行参数
【发布时间】:2021-08-30 17:29:08
【问题描述】:

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

我想写一个使用条件编译的makefile,这样如果我编译像 使特别=1 然后使用命令行参数。 如果我编译没有特别喜欢 制作 那么即使我们输入命令行参数也会被忽略。

如何使它成为可能。 我正在使用以下编译命令 gcc -o myprog myprog.c prog2.c prog3.c

【问题讨论】:

    标签: linux gcc makefile arguments conditional-statements


    【解决方案1】:

    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 的含义,以便它启用脚枪版本,而不是相反(这个答案的原始版本有这个设计,只是因为我读过你的问题原来的方式)。

    【讨论】:

    • myprog-footgun 的显式配方对于实际使用可能过于简单(它缺少库路径等)。具有符号链接的系统上的一种解决方法是使用ln -s myprog.c myprog-footgun.c,然后让make 运行其默认配方(不过您也需要稍微更改DEPS)。
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多