2014-10-26 76 views
0

我現在有下面的Makefile有沒有一種方法,以進一步縮短和推廣這個Makefile

test: main.o car.o student.o house.o 
    $(CXX) $(CXXFLAGS) -o test main.o car.o student.o house.o 
    objcopy --only-keep-debug test test.debug 

main.o: student.h house.h main.cpp 
    $(CXX) $(CXXFLAGS) -c main.cpp 

car.o: car.h 

student.o: student.h car.h 

house.o: house.h 

我的問題是我能縮短文件以類似

test: *.o 
     $(CXX) $(CXXFLAGS) -o test *.o 
     objcopy --only-keep-debug test test.debug 

如何將目標依賴工作?我正在考慮尋求某種東西的原因是因爲我不想每次添加新的頭文件或cpp文件都將東西添加到我的Makefile中?

+0

你認爲'* .o'是什麼? – Deduplicator 2014-10-26 21:54:17

+0

* .o將是所有目標文件 – Rajeshwar 2014-10-26 22:36:10

+0

所有哪些目標文件? – Deduplicator 2014-10-26 22:36:30

回答

0

你絕對可以在makefile中使用test: *.o

雖然你可能不想。對於新創建的.c文件,這絕不會包含.o文件,因爲它們不存在。

儘管通過使用$^automatic variable可以避免列出配方體中的每個文件。

0

這可能會做你想要的,自動重新計算相關性:

CPPFLAGS += -MMD 
SOURCES = $(wildcard *.C *.c *.cpp *.cxx *.c++) 
OBJECTS = $(addsuffix .o,$(basename $(SOURCES))) 
.PHONY: all 
all: appname appname.debug 
appname.debug: appname 
    objcopy --only-keep-debug $< [email protected] 
appname: $(OBJECTS) 
include *.d 

-MMD - 選項,這對編譯提取依賴於.dhttps://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Preprocessor-Options.html#Preprocessor-Options -files

我計算所有可能的源 - 文件,並從它們所有的對象文件,因爲*.o只會匹配已有的文件

+0

這看起來很有趣。我將研究這個並回傳。感謝您的發佈 – Rajeshwar 2014-10-27 00:35:09

0

這是一個想法「每次添加一個cpp文件時添加東西到Makefile」,你應該說服自己。

第一個原因是,如果每次更改源列表時更改Makefile,並且依賴Makefile上的目標,那麼當您更改源列表時,目標會自動重新編譯,因爲它們應該是這樣的,那就是方式製造被設計工作。不要與它戰鬥。

第二個原因是,你想明確地聲明你的來源,所以你可以向你自己和其他人澄清你的意圖。我的實踐表明,這使代碼更易於維護。

第三個原因是,所以您可以使用相同的擴展名添加其他文件,也許是臨時的,這些擴展名不是來源。

記住,在這裏我認爲是重寫Makefile的最好方法。請注意,我沒有在這裏做任何自動的依賴關係生成。如果你這樣做,那麼與其他人指出的文件中的.o文件的各種依賴關係不同,你可以自動生成這些文件。

SRCS := main.cpp car.cpp student.cpp house.cpp 

OBJS := $(SRCS:cpp=o) 

.PHONY: all 
all: test test.debug 

test: $(OBJS) Makefile 
    $(CXX) $(CXXFLAGS) -o [email protected] $(OBJS) 

%.debug: % Makefile 
    objcopy --only-keep-debug $< [email protected] 

$(OBJS): %o: %cpp Makefile 
    $(CXX) $(CXXFLAGS) -c $< 

main.o: student.h house.h 

car.o: car.h 

student.o: student.h car.h 

house.o: house.h 
+0

您能否解釋一下您所建議的更改。這肯定會幫助所有人走出很多 – Rajeshwar 2014-10-27 08:12:04

+0

你知道,DRY是一個軟件設計的宗旨,原因在於:任何重複都可能產生微妙的差異,因此更有可能(這意味着錯誤)。特別是如果沒有任何檢查各個地方你相互信息相同的信息。 – Deduplicator 2014-10-28 02:19:05

相關問題