2015-12-13 29 views
2

我想要包含一個文件併爲路徑使用預處理器定義。包含帶預處理器的文件定義

// in projects preprocessor definitions:  
HEADER="../somePath/theHeader.h" 

// in a file 
#include HEADER 

這適用於Windows,但XCode抱怨這一點,無法找到該文件。用路徑替換HEADER工作,所以文件實際存在。那麼,我錯過了什麼?

回答

4

我錯過了什麼?

足夠的引號,可能。在Unix上,您需要:

HEADER = "../somePath/theHeader.h" 

${CC} ${CFLAGS} -DHEADER='${HEADER}' -c file.cpp 

宏定義包括雙引號。如果您沒有在單引號中包含-DHEADER參數,則shell(un)會有用地除去雙引號。通過將它放在單引號內,shell有助於刪除單引號,並留下雙引號,供編譯器查看。

Windows上的命令行處理規則不同,並且引號的處理方式與cmd.exe處理器的處理方式不同。

順便說一句,我希望把它可行的人類,爲HEADER在命令行上指定的值,我用:

HEADER = ../somePath/theHeader.h 

${CC} ${CFLAGS} -DHEADER='"${HEADER}"' -c file.cpp 

現在我可以運行:

make HEADER=/other/path/to/header.h file.o 

和有用。如果你想使用一個命令輸出到指定的文件名

make HEADER='"/other/path/to/header.h"' file.o 

或類似的東西,這是fiddlier,和雙尷尬:與原來的符號,我不得不寫。與第二次比較的第一個選項:

make HEADER=$(locate header.h) 
make HEADER="\"$(locate header.h)\"" 
+3

或者,你可以使用預處理程序插入引號,這可能是少些麻煩:'#定義字符串化(X)STRINGIFY_(X)'/'#定義STRINGIFY_( x)#x' /'#include STRINGIFY(HEADER)' – rici

+0

這是真的;我不需要使用它,但它應該可以正常工作。而且,正如你所說,它會避免在命令行上引用引號,這很有幫助。 –

+1

@rici你的blurb值得成爲一個答案。 – Olumide