2017-08-07 353 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