【问题标题】:Choosing different header file depending on instructions from Makefile根据 Makefile 中的说明选择不同的头文件
【发布时间】:2018-05-30 19:10:25
【问题描述】:

我正在尝试重新组织某人的代码,但我似乎碰壁了。 我在fnc.c 中有一个函数int fnc(),由main1.cmain2.c 调用。使用 makefile 从main1.cmain2.c 编译可执行文件:

main1: main1.o fnc.o
    gcc main1.o fnc.o -o main1.x

main2: main2.o fnc.o
    gcc main2.o fnc.o -o main2.x

main1.o: main1.c
    gcc -c main1.c

main2.o: main2.c
    gcc -c main2.c

fnc.o:
    gcc -c fnc.c

唯一的问题是,fnc.c的序言中要包含两个头文件header1.hheader2.h取决于编译的是main1.x还是main2.x

#include "header1.h"

int fnc(){
    // do stuff
}

是否可以根据make main1make main2 的类型来选择要加载的标头?

【问题讨论】:

  • 将对应的定义通过-D传递给编译器。并在源代码中检查#ifdef
  • 如果你必须单独重新编译fnc.c,为什么还要单独编译?
  • @melpomene 如何在不编译 fnc.c 的情况下做到这一点?

标签: c makefile header-files code-organization


【解决方案1】:

您可以使用-D 编译器标志来定义预处理器可见的符号。然后用预处理器#ifdef 指令检查它。如:

生成文件:

main1: main1.o fnc1.o
    gcc main1.o fnc1.o -o main1.x

main2: main2.o fnc2.o
    gcc main2.o fnc2.o -o main2.x

main1.o: main1.c
    gcc -c main1.c

main2.o: main2.c
    gcc -c main2.c

fnc1.o:
    gcc -o fnc1.o -c fnc.c -DCONFIG1

fnc2.o:
    gcc -o fnc2.o -c fnc.c -DCONFIG2

你的来源:

#ifdef CONFIG1
#include "header1.h"
#elif defined(CONFIG2)
#include "header2.h"
#else
#error "blah"
#endif

int fnc(){
    // do stuff
}
  • 注意 - 这既不是经过测试也不是最佳解决方案。只是给出想法

【讨论】:

  • 您也可以“静态地”执行此操作:将#include "header1.h" #include "fnc.c" 放入fnc1.c,并将#include "header2.h" #include "fnc.c" 放入fnc2.c。然后将 fnc1.cfnc2.c 的常用规则放入您的 Makefile 中。
  • @melpomene 也许值得成为一个额外的答案。
  • 谢谢。 -DCONFIG1之间应该有空格吗?
  • @sodiumnitrate 不需要空间。
  • @melpomene It's only two lines. 肯定是 OP 很好地发布了 minimal reproducible example 的结果
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多