宏定义如何从 Makefile 传递到头文件?
how a macro definition is passed from Makefile to a header file?
我正在尝试使用已定义和未定义的 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)
这是一个如何做我认为你想要的事情的例子:
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
每个编译器都有一个环境变量,它将参数传递给 compiler/linker。在处理除 GCC 以外的其他问题时,我们需要在使用前找到该环境变量。
在我的例子中,RVCT31_CCOPT 是在构建时将参数传递给编译器的变量。
我正在尝试使用已定义和未定义的 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)
这是一个如何做我认为你想要的事情的例子:
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
每个编译器都有一个环境变量,它将参数传递给 compiler/linker。在处理除 GCC 以外的其他问题时,我们需要在使用前找到该环境变量。
在我的例子中,RVCT31_CCOPT 是在构建时将参数传递给编译器的变量。