2010-03-02 58 views
42

使用Makefile的較大C++項目的目錄結構是什麼?使用Makefile的大型C++項目的目錄結構是什麼?

這是我的目錄結構是怎樣看待的時刻:

lib/ (class implementations *.cpp) 
include/ (class definitions *.h) 
tests/ (main.cpp for quick tests) 

現在,我不知道我的Makefile應該什麼樣子......它似乎不工作的時候.cpp文件和.h文件不在同一個目錄中。任何人都可以用一個附帶的Makefile指向一個共同的目錄結構,這樣我就不會重新發明輪子了嗎?

+0

你有一個Makefile目前?如果是這樣,你可以考慮發佈它以獲得具體的反饋 – 2010-03-02 04:15:16

+0

使用Make VPATH = ../lib:./ include將在測試目錄中提供標題 – 2016-10-26 03:46:40

回答

51

分離.h文件的.cpp並不總是一個好的解決方案。通常,我將它們作爲庫(包含頭文件中的公用頭文件和包含源代碼的私有頭文件)分開使用。

如果是圖書館,這種結構是好的。

lib/ (class implementations *.cpp .h) 
include/ (class definitions *.h) <- Only those to be installed in your system 
tests/ (main.cpp for quick tests) 
doc/ (doxygen or any kind of documentation) 

如果它是一個應用程序

src/ (source for the application) 
lib/ (source for the application library *.cpp *.hpp) 
include/ (interface for the library *.h) 
tests/ (main.cpp for quick tests) <- use cppunit for this part 
doc/ (doxygen or any kind of documentation) 

使用標誌-I $(PROJECT_BASE)/包括指定包括編譯

路徑,如果它是一個大的項目,它可以很好的使用工具,如autoconf/automakecmake來構建一切。它會緩解發展。

+4

我不明白。 'src'和'lib'有什麼區別? – feeela 2013-02-20 16:03:02

+1

當應用程序太大時,您希望將程序分隔到不同的模塊中。可以獨立使用的模塊,您可以在其他應用程序中重複使用。所以你可以像lib/LibraryForLogging,lib/LibraryForDatabase等那樣編寫它......它比與所有源代碼混合在一起更容易管理。 – Phong 2013-02-21 06:02:02

+0

這似乎是一個乾淨的方式來做到這一點,但輸出(構建文件)文件夾呢?比方說,我想建立一個庫(不安裝它),我應該把它放在什麼文件夾? – gromit190 2016-07-01 10:29:18

6

沒有「好的目錄結構」。選擇一個你感覺舒適的結構並堅持下去。有些人喜歡將源文件(頭文件和實現文件)放在src/目錄中,所以項目的根目錄只有一個makefile,一個自述文件和其他的東西。有些人喜歡doc/

我還沒有聽到任何人分裂的頭文件和實現文件分爲兩個不同的目錄下,雖然放置lib/目錄下幫手庫,單元測試test/src/test/,文件下。就我個人而言,我不喜歡將文件分割成很多目錄。我通常將所有源代碼放在一個目錄中,並將所有文檔放在另一個目錄中。如果我依靠良好的搜索工具,則不需要複雜的目錄結構。

make可以處理makefile駐留在與源不同的目錄中的那種結構。唯一的問題是它會從makefile的目錄中調用規則 - 編譯器通常沒有問題編譯某個子目錄中的源代碼。您不必在您的#include中指定相對路徑;只需指定帶編譯器標誌的include路徑(gcc的-I標誌等)。

+5

和'bin /'的可執行文件中:) – Lipis 2010-03-02 04:53:18

12

如果你有很多的源文件,進一步細分你的源代碼目錄也是一個好主意。舉例來說,一個子目錄您的應用程序,一個用於GUI的核心功能等

src/core 
src/database 
src/effects 
src/gui 
... 

這樣做也迫使你避免你的「模塊」,這是尼斯和可重複使用的先決條件之間的關係不需要碼。

12

沒有一個特定或必需的目錄結構。

您可以隨意設置它。你的問題很容易解決。只需指示Makefile查看子目錄或將編譯對象放入子目錄中,而不是僅使用當前目錄。

你會在Makefile文件路徑只需使用:

%.o : %.cpp 

bin/%.o : %.cpp 

更換所以它會檢查是否在目錄bin二進制文件是否存在等等,你可以在同一個應用到位置在哪裏編譯文件。

可以添加/刪除/修改源文件和目標文件的路徑。

看一看gnu make manual,特別是部分8.3功能文件名,那8.2功能的字符串替換和分析前的一個。

你可以做的東西,如:

得到源文件的列表,當前目錄對象的列表:

OBJ  = $(patsubst %.cpp, %.o, $(wildcard *.cpp)) 

輸出:

Application.o Market.o ordermatch.o 

如果二進制對象在子目錄bin但源代碼在當前目錄中,您可以將前綴bin應用於生成的目標文件:

OBJ  = $(addprefix bin/,$(patsubst %.cpp, %.o, $(wildcard *.cpp))) 

輸出:

bin/Application.o bin/Market.o bin/ordermatch.o 

等。

相關問題