2017-01-09 46 views
1

我正在研究Makefiles的美妙世界,這是我第一次嘗試自己的makefile。然而,我在錯誤的牆上打了我的小腦袋,我無法確定原因,我只知道問題出在Makefile中,我做錯了什麼,因爲當我手動編譯我的「項目」時,它會編譯。Fake Makefile會導致未定義的引用和多個定義錯誤

cxx := g++ 
dirs := obj bld_win32 bld_linux 
cpp := $(wildcard src/*.cpp) 
obj := $(addprefix obj/,$(notdir $(cpp:.cpp=.o))) 

ifeq ($(OS), Windows_NT) 
    target := bld_win32/engine.exe 
    flags := -mwindows -lopengl32 -openal32 -lgdi32 
else 
    target := bld_linux/engine 
    flags := -lX11 -lGL -lopenal -lalut 
endif 

all: precheck $(target) 

precheck: 
    mkdir -p $(dirs) 

$(target): $(obj) 
    $(cxx) -std=c++11 -Wall -o [email protected] $^ $(flags) 

obj/%.o: $(cpp) 
    $(cxx) -c -o [email protected] $< 

回答

1

你的模式規則是錯誤的,因爲你會注意到如果你試圖用這個makefile一個接一個地構建目標文件。這條規則:

obj/%.o: $(cpp) 
    $(cxx) -c -o [email protected] $< 

列出所有源文件的先決條件每目標文件,當您嘗試建立任何目標文件,它編譯只有在列表中的第一個源文件(src/aardvark.cpp,或其他),以便所有的目標文件都是相同的,即使它們有不同的名稱。

它改成這樣:

obj/%.o: src/%.cpp 
    $(cxx) -c -o [email protected] $< 
+0

是的,我傻,我忘了手動測試編譯對象。萬分感謝! –