2017-08-07 36 views
0

我正在尝试用未定义的宏定义&两次编译源代码。因此,对于默认的宏未定义&我想通过从Makefile的参数来定义该宏,就像如何将宏定义从Makefile传递到头文件?

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

,所以我用这个ONE_MACROfile.h我。 这个定义如何反映并知道预处理器。这里我使用cygmake。如何通过MACRO as argument to compilercygmake工具。

file.h: -

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

所以这ONE_MACRO是如何从make文件中定义,即时通讯试图通过宏作为参数,如下

的Makefile: -

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

你的问题不清楚。 [This](http://www.cplusplus.com/doc/tutorial/preprocessor/)显示了如何在'file.h'中使用'#ifdef'。这是否回答你的问题? – Beta

+0

目前尚不清楚你在问什么。编译器处理'-D MACRO_DEFINE = 1'参数(通常在选项字母“D”和值“MACRO_DEFINE = 1”之间没有空格),就好像有一行代码读取了“#define MACRO_DEFINE 1” 。这是在处理任何实际代码之前设置的。这很简单,所以它可能不是你要问的 - 但不清楚你在问什么。 –

+0

我想将一个**宏从Makefile作为参数传递给编译器**,这个宏在'file.h'.so编译时使用,我会根据宏编译两次'file.h' **根据定义和未定义**。我现在认为它很清楚。 – Kumar2080

回答

1

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

像我这样的智慧RVCT31_CCOPT是在构建时将参数传递给编译器的变量。

0

下面是一个如何做我认为你想要的例子:

define_test.c:

#include <stdio.h> 

#ifndef X 
#define X 1 
#endif 

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

的Makefile:

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

define_test: FORCE 
     $(CC) $(CPPFLAGS) define_test.c -o [email protected] 

FORCE: 

然后通过宏观X不同的值:

make X=2 

(这里假设你想要的宏的值是一个整数;如果你想要的值是一个字符串,你必须得到比较麻烦一些,使用引号正确)

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

make CPPFLAGS+=-DX=2

+0

我试过这个概念,但是cygmake给了我无效的选项 'cygmake:invalid option - D'。 – Kumar2080

+0

当然'-D'是无效选项;这是预编译器的一个选项。你说你“尝试了这个概念”,但是你究竟输入了什么**?您是否输入了例如'make CPPFLAGS + = - DONE_MACRO = 1'? – varro

+0

是的,我已将-D添加到CPPFLAGS。 这里编译器及其参数是通过codeblocks配置文件.cbp给出的。 Main Makefile会调用子文件夹makefiles,这个cbp文件被执行并编译代码。 – Kumar2080