2013-02-15 44 views
2

您好(我正在使用Windows,mingw g ++編譯器和mingw32-make)
爲了概括我的問題,我想學習如何編寫如下的C++源文件:在使用make構建C++文件時推廣包含語句

假設Foo.cpp中依賴foo.h中,其中Foo.cpp中在src \和foo.h中是包括\
// foo.cpp
#include "foo.h"

通常我會只寫像這樣
//foo.cpp
#include "..\include\foo.h"

但我發現隨着我的項目不斷增加,我開始需要更多的組織,這種方法不夠動態。原因是如果我想將foo.h移動到新目錄(比如include \ bar \ foo.h),我必須更改每個文件的每個包含。有沒有一種方法可以實現這一點。如果是這樣的話,也可以爲頭文件依賴性完成。

作爲一個便箋,我是新的makefile。我甚至不確定它是否知道這些包含在那裏,因爲它們在代碼中(實際上根據我所瞭解的內容)。那會導致我一個不幸的第二個問題,這可以讓這些包括?如果沒有,是否有可能改變它,以便它可以?隨意回答你將如何解決這個問題,因爲我有一種感覺,我將這種錯誤的方式放在文件中,而不是將它們鏈接到makefile中。

回答

5

編譯器一直在尋找一些默認路徑來尋找.h文件。你可以添加你的路徑。

例如gcc獲取多個-I參數包含的路徑。在你foo.cpp你這樣做:

#include "foo.h" 

和編譯時,你說:

g++ -I../include foo.cpp -c [other options] 

關於您的問題的第二部分:makefilemake的調用通常不知道要編譯的文件和有關您的項目的任何內容。然而,make中有幾個默認變量和指令會導致這種印象:在您的環境中,您可能只需更改CFLAGSCPPFLAGS變量以添加-I-參數,並且它將起作用。

+0

感謝您提供非常快速的答覆和直接的答案。當我再次訪問該項目時,我會嘗試它。 – Steven 2013-02-15 20:03:10

2

帕特里克B已經回答了關於如何使編譯器很清楚知道從哪裏包括但下列位:

作爲一個方面說明我是新來的makefile。我甚至不知道它是否知道 這些包括在內,因爲它們在代碼中(實際上從 我所瞭解它不)。那會導致我一個不幸的 次要問題,這是否可以使這些包括?如果不是,它可以改變它,以便它可以?

沒有,讓不理解你的源文件包含什麼,或者他們是如何依賴於其他文件[製作也並不真正關心,如果你用C,C++編程,Fortran語言,帕斯卡爾,ADA,Lisp語言,Cobol或Haskell - 只要有一個「如果你有這樣的文件,並想通過做一些文件之類的文件」關係,make會爲你分類。

有幾種方法可以做到這一點。您可以手動添加:

foo.cpp: foo.h 

或者你可以使用你的包含文件的依賴關係文件,並讓加入這一點,例如make自動建造它,:

SOURCES = foo.cpp # Add any further source files here. 
INCLUDES = -I../includes # Add other include directories if needed. 

CFLAGS += ${INCLUDES} 

TARGET = foo.exe # in Windows. Just foo in linux/MacOS. 

all: ${TARGET} deps.mk 

${TARGET}: ${SOURCES} 
    gcc -O [email protected] $^  

desp.mk: ${SOURCES} 
    gcc -MM ${INCLUDES} $^ > [email protected] 

include deps.mk 

注意的makefile取決於縮進是製表符。這篇文章使用空格,所以你需要「tabify」收件人。還要注意,在一個「正確的」makefile中,你可以從foo.cpp等製作foo.o,並將所有不同的.o文件鏈接在一起。這樣,對於大型項目來說,編譯速度要快一些。爲了便於閱讀,我簡化了它。

也許我應該擴大一點點:

gcc -MM給出了一個列表(標準輸出)正在「編譯」和它的所有依賴的文件。它實際上並沒有編譯代碼(只要代碼至少是SOMEWHAT)接近於可編譯的,它會愉快地處理你的文件。

有關gcc -MM及相關的更多詳細信息,請參閱GCC invocation文檔。

[email protected]$&^是什麼make調用「自動變量」 - 它們擴展到「目標」(易記,因爲它看起來有點像在或類似的射箭目標)和「所有的依賴關係」(這裏沒有視覺線索,我害怕 - 而且每隔一段時間,我都必須提醒自己)。查看here瞭解更多詳情。

+0

補充:一些編譯器有一個選項,例如-M,爲'make'生成一個依賴文件。 – 2013-02-15 19:35:42

+0

是的,這就是'gcc -MM'是 - '-M'還列出了標準庫文件,這通常不需要在makefile中使用[因爲它們通常不會經常更改,甚至更少會以實際影響的方式該程序]。 – 2013-02-15 19:38:35

+0

你和帕特里克希望完美地回答我的問題。當我找到時間來測試這個結果時,我會回覆你的結果。 – Steven 2013-02-15 21:54:39

相關問題