2011-06-28 32 views
2

你的小C/C++項目已經達到了一個點,它不再實際擁有所有的代碼在一個文件中。你想拆分出幾個組件。所以你製作一個src/目錄,然後......你必須寫一個真正的Makefile。超過hello: hello.o的東西。呃哦......是[email protected]還是$<$^?廢話。你不記得(我從來沒有)。規範「簡單的項目」的makefile

你有一個「一刀切」的簡單的Makefile可以處理簡單的源代碼樹?如果是這樣,那麼它是什麼?爲什麼?我正在尋找最小,最簡單的Makefile,它可以很好地編譯一個充滿C文件的目錄,而不必每次添加文件時都要編輯Makefile。這是我到目前爲止有:

CXX = clang++ 
CXXFLAGS = ... 
LDFLAGS = ... 
EXENAME = main 

SRCS = $(wildcard src/*.cc) 
OBJS = $(patsubst src%.cc,build%.o, $(SRCS)) 

all: $(EXENAME) 

build/%.o: src/%.cc 
    @mkdir -p $(dir [email protected]) 
    $(CXX) -c -o [email protected] $^ $(CXXFLAGS) 

$(EXENAME): $(OBJS) 
    $(CXX) -o [email protected] $^ $(LDFLAGS) 

clean: 
    rm -rf $(EXENAME) build/ 

這個Makefile構建所有在src/目錄到在build/目錄.o文件.cc文件,然後鏈接起來到父目錄。

你會做什麼不同?

+1

我會使用cmake。一旦你有幾個頭文件,直接維護一個Makefile就不會擴展。 Autotools體積龐大,需要太多步驟。 Cmake是一款真正的萬能工具。 –

+0

我肯定會使用cmake超過10個文件;對於那些比這更小的東西,它似乎有點沉重。 – nornagon

+0

這真是令人驚訝的不重要,它確實只是完成必要的工作量。在第一次調用之後,即使你改變了CMake文件,你也只需要繼續調用'make'就可以了 - 就像它計算出依賴的方式一樣: - (但是,它確實創建了一個目錄結構,你可能會發現太多太小的情況。) –

回答

1

我會重新考慮你的決定不具有的sources--明確的清單,我認爲這可能會導致您在長遠的麻煩。但如果這是你的決定,這個makefile是相當不錯的。

%.o規則我會用$<代替$^,這樣以後就可以添加依賴像

build/foo.o: bar.h 

,當你準備好了,你可以看看Advanced Auto-Dependency Generation

+0

爲什麼這可能會給我帶來麻煩? – nornagon

+0

@nornagon:通常有兩個(或更多)不同的可執行文件有一些共同的代碼。保持非通用代碼的解開狀態將需要makefile中的顯式源列表或反映依賴關係圖的目錄結構 - 前者通常更簡單。但如果你遇到這個問題,很容易從一個方案轉移到另一個方案。 – Beta

0

我從來沒有使用CMake的,所以我真的不能說的事情。我可以提供的最好的方案是我們在學校裏所稱的'makemake',它會自動生成Makefiles - http://www.cs.rit.edu/~swm/makemake/這不是一個非常高級的程序,但它可以完成工作。另一方面,它使用起來非常簡單 - 只需在目錄中執行「makemake> Makefile」,並且您將擁有一個Makefile,它將構建並鏈接該目錄(C和C++)中的所有源文件。光明的一面,如果你添加了更多的文件,你只需再次運行makemake,並且你有一個新的makefile。不利的一面是,沒有辦法讓你從一個生成的makefile到下一個生成的任何自定義目標。對於'一刀切'的makefiles,雖然你可以做到這一點,但它首先從'make'命令的目的 - 這是爲了跟蹤文件的最後修改時間,因此只能重新編譯最近更改過的文件,或者依賴剛剛更改的頭文件(儘管要生成正確的文件,您可以使用'makedepend' - http://www.x.org/archive/X11R7.5/doc/man/man1/makedepend.1.html)。你可以使用你現在擁有的makedepend來創建一個自我更新的makefile。

-1

使用automake工具。它很容易對開發人員進行更改和減輕負擔。它與指定SOURCES,LDLIBS,LDFLAGS作爲變量一樣簡單。起初它可能看起來有點奇怪。但隨着你做更多的事情,它會成爲你的最愛。

+2

我討厭autotools與復仇。另外,對於6個文件的項目來說,這種方式是過度的。 – nornagon

+1

我討厭autotools,因爲大多數時候,我最終在自動工具的'* generated *文件中產生了比我的程序本身中的SLOC更多的SLOC。這是完全不平衡和荒謬的。 –