2017-06-02 143 views
-1

首先 - 我知道有很多類似的討論,但我花了幾個小時沒有他們爲我工作。GNU make在新創建的子目錄

我的makefile首先創建一個按當前日期和時間命名的目錄。然後我把makefile附加到一個頭文件中,該行用這個目錄名創建一個字符串。出於這個原因,我首先需要將所有源文件(包括頭文件)複製到新創建的子目錄中,以便保留原始頭文件並只修改將用於編譯的頭文件(在子目錄中)。然後我想建立在這個新目錄中。

我的問題在於如何正確構建新子目錄中的.o文件。我已經找到了解決辦法是讓

$(NOW)%.o: $(NOW)%.cpp $(CC) -c $(FLAGS) $<

其中$(NOW)$是子目錄名。問題是,我$(FLAGS)似乎被忽略:輸出,大致

g++ -c -o <.o file> <.cpp file>

(是的,其實是多餘的介紹g++-c之間的空間。)而建設中的頂層目錄一拉

%.o: %.cpp $(CC) -c $(FLAGS) $<

正確輸出

g++ -c <my flags> -o <.o file> <.cpp file>

總而言之,通過將源文件傳輸到新創建的子目錄並在該目錄中構建.o文件,我無法正常編譯。 TYIA。

+2

發佈'$(FLAGS)'設置的行。如果它是一個特定於目標的變量,那麼這可能會導致您描述的問題。另外,如果它是使用':='設置的,並且是'$(NOW)%。o'目標下的,那麼它的值將不會在該規則中生效。更完整的makefile會明確幫助診斷問題。 – blackghost

回答

-1

Ad John指出,沒有辦法用您提供的makefile的一小部分來明確診斷您的問題,因爲錯誤不在您提供的代碼中,而是在makefile的其他部分。理想情況下,您需要提供SSCCE,但如果不是這樣,那麼至少我們需要了解如何設置NOW變量以及鏈接器規則,以便我們知道製作嘗試構建的內容。

我還應該指出,按照慣例,您不應該使用CC來保存C++編譯器; CC變量包含C編譯器。對於C++編譯器使用CXX,對於C++編譯器標誌使用CXXFLAGS

一種可能性是您正在使用遞歸賦值分配NOW變量,以便每次計算變量時都會重新創建時間戳;它可能是時間戳在makefile的生命週期中發生變化。

另一個很常見的問題是您創建了模式規則,但make並沒有使用它,因爲目標使得想要構建的模式不匹配。

因此,舉例來說,如果你的鏈接線看起來是這樣的:

SRCS = foo.cpp 
OBJS = $(SRC:.cpp=.o) 

myprog: $(OBJS) 
     $(CXX) ... 

$(NOW)%.o : $(NOW)%.cpp 
     $(CXX) ... 

那麼你的格局不會匹配,因爲提出的是試圖建立檔案foo.o和您的規則告訴它如何構建$(NOW)foo.o這是不是一回事。