2012-09-16 53 views
0

我的makefile工作好嗎(GNU製作),但我想知道是否讓「生成文件」更好看

  • 有一種方法,使一個新的目錄中的「bin」,並把所有的.o在那裏
  • 如果對「1」的回答是「是」,指令「make clean」是否可以刪除文件夾「bin」?
  • 避免必須編寫所有.cpp和.o文件名?
CFLAGS = -Wall -g 
CC = g++ 
EXEC = main 
OBJ = listpath.o Parser.o main.o 

all: $(EXEC) 

listpath.o: src/listpath.cpp 
    $(CC) $(CFLAGS) -c src/listpath.cpp 

Parser.o: src/Parser.cpp 
    $(CC) $(CFLAGS) -c src/Parser.cpp 

main.o: src/main.cpp 
    $(CC) $(CFLAGS) -c src/main.cpp 

$(EXEC): $(OBJ) 
    $(CC) $(CFLAGS) $(OBJ) -o $(EXEC) 

.cpp.o: 
    $(CFLAGS) $< 

.PHONY: clean 
clean: 
    rm $(OBJ) $(EXEC) 
+0

什麼讓方言也應該一起工作呢? POSIX make? GNU make?還有其他的東西嗎? – hvd

+0

如果你使用'CXX'和'CXXFLAGS',你將能夠利用很多隱式規則。 –

+0

GNU make。我編輯了我的帖子。 –

回答

3

與最後一個問題開始,你可以定義隱含規則轉換.c文件,以.o文件。

bin/%.o : src/%.cpp | bin 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

這也會將.o文件移出到bin /目錄。

現在你的結果規則將類似於:

$(EXEC): $(addprefix bin/, $(OBJ)) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

清潔bin /目錄下,簡單的改變你的淘規則:

clean: 
    rm -rf bin/ $(EXEC) 

最後,添加規則,創建的bin目錄:

bin: 
    mkdir -p bin 
+0

我用你的建議編輯了我的makefile,但它不起作用。它說:「致命錯誤:無法創建bin/listpath.o:沒有這樣的文件或目錄」。我想我錯過了創建「bin」文件夾的說明? –

+0

@ I19,是的,你需要添加一個規則來創建'bin'目錄。類似於:'bin:'和配方'mkdir -p bin'。 –

+0

@CarlNorum,我仍然得到相同的錯誤:S –

0

考慮使用一些makefile構建工具,如cmake或qmake。根據我的經驗,沒有明確命名makefile中的所有源文件是危險的。

如果你是onlinux,嘗試簡單

qmake -project && qmake && make 

源目錄中。 QMake將爲您創建makefile做所有的魔術。我相信,cmake也會這樣做。

2

從源代碼指定東西而不是通過某些中間產品(如.o文件)是一個好主意。使用模式替換來生成這些中間產品的名稱。如果您使用相同的模式來編譯每個文件,則無需多次指定。使用make的模式。

# The first rule that make sees is the default target. 
# I like to put the default target right up front so there is no doubt. 
default: all 

SRC = src/listpath.cpp src/Parser.cpp src/main.cpp 
# Or SRC = $(wildcard src/*.cpp) 

# Generate list of object files. 
OBJ = $(patsubst %.cpp, bin/%.o, $(notdir $(SRC))) 

# Compile rule 
$(OBJ): bin/\%.o : src/%.cpp bin 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

斌: 的mkdir斌

# Link rule 
$(EXEC): $(OBJ) 
    $(CC) $(CFLAGS) $(OBJ) -o $(EXEC) 

all: $(EXEC) 

clean: 
    rm -rf bin $(EXEC) 
+0

+1:此答案使用_Static Pattern Rules_。接近,但比之前建議的_Implicit Rules_更好。這些絕對是要走的路(參見make手冊)。 – bobbogo