【问题标题】:how a macro definition is passed from Makefile to a header file?宏定义如何从 Makefile 传递到头文件?
【发布时间】:2018-01-14 21:37:48
【问题描述】:

我正在尝试使用已定义和未定义的 MACRO 编译源代码两次。所以默认情况下,宏是未定义的,我想通过 Makefile 中的参数来定义这个宏,比如

$(MAKE) -c $(present_dir)/new_dir -DONE_MACRO=1

所以我在file.h 中使用这个ONE_MACRO。 这个定义是如何反映并知道预处理器的。我在这里使用cygmake。如何使用 cygmake 工具传递MACRO as argument to compiler

file.h:-

#if ONE_MACRO
  #define some_targets
#else
 #define other_targets
#endif

那么这个 ONE_MACRO 是如何从 make 文件中定义的,我试图将宏作为参数传递如下

生成文件:-

MY_TARGET:
    $(MAKE) -C $(present_dir)/target_dir -D ONE_MACRO=1 $(MAKECMDGOALS)

【问题讨论】:

  • 您的问题不清楚。 This 展示了如何在 file.h 中使用 #ifdef。这能回答你的问题吗?
  • 不清楚你在问什么。编译器将-D MACRO_DEFINE=1 参数(通常写入选项字母D 和值MACRO_DEFINE=1 之间没有空格)视为有一行代码读取#define MACRO_DEFINE 1。这是在处理任何实际代码之前设置的。这是直截了当的,所以它可能不是你要问的——但不清楚你要问的是什么。
  • 我想将一个宏作为参数从 Makefile 传递给编译器,这个宏在file.h.so 中使用,所以在编译时我将编译file.h 两次基于定义和未定义的宏。我想现在很清楚了。

标签: makefile cygwin


【解决方案1】:

这是一个如何做我认为你想做的事的例子:

define_test.c:

#include <stdio.h>

#ifndef X
#define X 1
#endif

int
main()
{
    printf("X = %d\n", X);
}

生成文件:

X = 1
CPPFLAGS += -DX=$(X)

define_test: FORCE
        $(CC) $(CPPFLAGS) define_test.c -o $@

FORCE:

然后为宏 X 传递不同的值:

make X=2

(假设您希望宏的值是一个整数;如果您希望该值是一个字符串,则必须在正确引用时变得更加棘手。)

您也可以将定义直接添加到 CPPFLAGS 中,例如:

make CPPFLAGS+=-DX=2

【讨论】:

  • 我试过这个概念,但是 cygmake 给了我无效的选项cygmake: invalid option -- D
  • 当然-D 是无效的选项;这是预编译器的一个选项。您说您“尝试了这个概念”,但您究竟输入了什么?你输入了例如make CPPFLAGS+=-DONE_MACRO=1 吗?
  • 是的,我已将带有 -D 的宏附加到 CPPFLAGS。这里编译器及其参数是通过代码块配置文件 .cbp 给出的。主 Makefile 将在那里调用子文件夹 makefiles 这个 cbp 文件被执行并编译代码。
  • 当宏在头文件中定义并且宏正在将参数传递给编译器时,我看到了差异。拆解让我与众不同。
【解决方案2】:

对于每个编译器,都有一个环境变量,它将参数传递给编译器/链接器。在处理 GCC 以外的其他环境变量时,我们需要在使用前找到该环境变量。

在我的例子中,RVCT31_CCOPT 是在构建时将参数传递给编译器的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    相关资源
    最近更新 更多