【问题标题】:Use define macro from source file in a Makefile在 Makefile 中使用源文件中的定义宏
【发布时间】:2018-03-23 04:36:30
【问题描述】:

我想使用在我的一个源文件中定义的预处理器宏作为我的 Makefile 中的变量。最简单的方法是使用sed 之类的程序来查找宏。但是,宏是基于条件(其他宏)定义的,因此对该宏的简单搜索可以产生多个结果。这个 sn-p 可以说明它:

#ifdef FOO
#define BAR 10
#else
#ifdef BAZ
#define BAR 50
#else
#define BAR 100
#endif
#endif

Makefile 如何知道源文件中是否定义了FOOBAZ,从而在编译过程中最终获得BAR 的正确值?

【问题讨论】:

    标签: bash makefile gnu-make


    【解决方案1】:

    对此问题的不同看法是质疑自己为什么 C 常量必须在编译过程之外发挥作用。然后经常会发现这个常量(以及许多其他常量)确实不是 C 程序的常量部分,而是一个配置项。因此,值得考虑的是,这些配置项是否真的应该隐藏在 C 源文件中,或者从更适合的配置格式生成 C 源代码是否更干净。根据我的经验,每个比 HelloWorld 稍大的项目都会很快从干净且可控的关注点分离(源代码编辑与配置编辑)中获益。

    【讨论】:

    • 这是有道理的,我很乐意考虑做这样的事情。您对通常如何完成此操作有任何参考吗?
    【解决方案2】:

    您可以为此使用cpp(或cc -E)。最简单的使用方法是将所有宏定义放入一个头文件中,比如macros.h。你还需要一个特殊的 C 文件(比如macros.c),你只使用你的宏。选择一个易于过滤的前缀,例如:

    #include "macros.h"
    
    valueOf_FOO = FOO
    valueOf_BAR = BAR
    

    现在,您可以使用

    提取宏值
    $(CC) -E $(CFLAGS) $(OTHER_CFLAGS) macros.c | grep '^valueOf_' | sed 's/valueOf_//'
    

    这将打印出来

    FOO = FOO
    BAR = 50
    

    到终端。

    【讨论】:

      猜你喜欢
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多