2012-06-28 69 views
1

我是新來製作文件,我把這個一起試用&錯誤。這段代碼用於編譯我的C++程序。爲什麼我的make文件沒有留下目標文件?

我的main.cpp文件與makefile位於同一文件夾中。我有一個lib /文件夾,其中包含標題主要依賴。

以下makefile會導致我的代碼的正確和完整的編譯。但我期待着我會發現留下* .o對象。 (請注意,我試圖讓既沒有「乾淨」的規則,我也得到了同樣的結果兩次。)

# 
# Makefile 
# 

CXX = g++ 
CCFLAGS = -O3 -I/sw/include -L/sw/lib 
     ## /sw/include and /sw/lib contain dependencies for files in my lib/ 
LDFLAGS = -lpng 
OPTS = $(CCFLAGS) $(LDFLAGS) 

SOURCES = $(wildcard lib/*.cpp) main.cpp 
OBJECTS = $(SOURCES: .cpp = .o) 
TARGET = spirals 

$(TARGET): $(OBJECTS) 
    $(CXX) $(OPTS) $^ -o [email protected] 

.PHONY: depend 
depend: 
    g++ -MM $(SOURCES) > depend 
     ## generate dependencies list 
include depend 

.PHONY: clean 
clean: 
    rm -f *.o lib/*.o $(TARGET) 

而且,它很重要的情況下,我MacOSX上和我程序是在xcode中設計的。 (我知道xcode有它自己的構建流程,但是我正在爲一個linux系統設計一個命令行程序,並且我想測試編譯&在bash環境中鏈接,而不是僅僅通過xcode。)

問題:

  1. 我是正確的期望makefile文件產生* .o文件,一旦主要的目標已經創建了堅持圍繞?

  2. 如果是這樣,爲什麼我的生成文件不這樣做?

回答

4

如果你觀察什麼命令你$(TARGET)規則會導致運行:

g++ -O3 -I/sw/include -L/sw/lib -lpng lib/bar.cpp lib/foo.cpp main.cpp -o spirals 

你會看到$(OBJECTS)其實包含* .cpp文件,並且沒有* .o文件貼因爲你沒有要求任何。

的問題是在這裏:

OBJECTS = $(SOURCES:.cpp=.o) 

在書面的GNU的makefile,這個取代的參考用過量的空間寫的,所以從來不匹配任何內容和$(OBJECTS)結束了一樣$(SOURCES)。如上重寫它,它會做你所期望的。

(其他說明:-lpng需要去在鏈路命令的末尾一般要工作,所以你應該引入其它品牌變量(傳統上被稱爲$(LDLIBS)),以便安排一下,特別是作爲一個新來的makefile,你。會做的更好拼出你的依賴明確,而不是玩遊戲用$(wildcard)和計算$(OBJECTS)。在編譯過程中需要-I選項,同時在連接過程中使用-L選項,所以這將是很好的安排在單獨的規則中使用單獨的$(CXXFLAGS)/$(LDFLAGS)變量所以它們只在需要時才添加。)

+0

謝謝,我沒有意識到t他的空間引起了我的問題。我也很欣賞你的關於我的編譯與鏈接選項的提示! – vanilla

相關問題