2017-09-06 100 views
2

這是我在Stackoverflow上的第一個問題,所以如果我問任何荒謬的問題,請原諒我:D。

問題:
假設我想編譯一個程序,該程序位於目錄「my dir /」中,並帶有空格。假定程序的路徑名是「my dir/test.c」。

這裏是我嘗試了樣品的Makefile:
如何讓MAKEFILE在make規則中使用時保留字符串中的反斜槓序列?

CC = gcc 
DIR = my\ dir 
$(DIR)/test.out: $(DIR)/test.c 
# $(CC) $< -o [email protected] 
    $(CC) $(DIR)/test.c -o $(DIR)/test.out 



正如你可以看到,在最後一行(行5)我寫的源和的路徑名輸出文件,分別直接寫入前提條件和目標文件中。這樣做,因爲它產生的命令這工作得很好:
GCC我\目錄/ test.c的-o我的\目錄/ test.out
其中通過文件名(含空格)GCC或任何其他的語法正確的方式shell命令。

最後一行(第4行)是問題出在哪裏(註釋行)。我使用的自動變量$ @(目標)和$ <(第一和唯一的先決條件),產生的文件名參數爲GCC我預計
我的\目錄/ test.out我的\目錄/test.c,分別。但在這裏,由於某種原因,所產生的文件名是我DIR/test.out我DIR/test.c的,因此得到的命令是:
GCC我DIR/test.c的-o我的DIR /測試.out
現在在這裏,gcc認爲我的dir/test.c作爲不同的兩個不同的輸入文件名和命令生成錯誤。
這裏是產生錯誤輸出的屏幕截圖時,我去掉線-4和評論上面的Makefile的線路5:
make output

我的問題:
有沒有什麼辦法,甚至保留這些反斜線通過我使用自動變量的方式?或者是否有任何替代方案可以達到與使用自動變量相同的目標並解決我的問題?因爲靈活性在這裏很重要。

在此先感謝您的幫助!

回答

1

對自動變量使用雙引號或單引號。

使用單引號,如果你想避免被自動變量引用的值的shell擴展:

$(DIR)/test.out: $(DIR)/test.c 
    $(CC) '$<' -o '[email protected]' 

雙引號允許shell擴展。例如,如果在DIR一個美元符號:

DIR := $$my\ dir 

然後"[email protected]"將擴大到"$my dir",和外殼將其解釋爲$my變量。

+0

它的工作!我怎麼可能沒有想到這個!現在,如果我使用單引號,則生成的命令是gcc'my dir/test.c'-o'my dir/test.out'。類似的雙引號;在我的情況。非常感謝@RuslanOsmanov。你拯救了我的一天 –

相關問題