2013-05-14 319 views
0

我有一個包含多個.cpp和.h文件的項目。我有一個名爲Globals.h的文件,它包含在所有的.cpp文件中。 現在編譯這個文件時我使用了一些-D選項。這些選項不僅影響Globals.h,還會影響所有文件。使用gcc編譯帶-D選項的多個文件

在我的makefile中,我編譯每個文件時必須使用相同的-D選項。當然,當刪除這些選項時,會出現一些「未定義的」錯誤。

這意味着每次更改其中一個選項時,我都必須重新編譯整個項目。 有沒有辦法讓我只用Globals.h編譯這些選項?

這是我的makefile文件的一部分:即創建Globals.o 線:

Globals.o : $(GlobalsLib) $(GlobalsInc) 
     g++ -c -Wall $(CodeDefined) $(UserDefined) $(GlobalsLib) -std=c++0x -o Globals.o 

$(GlobalsLib)$(GlobalsInc)是路徑文件Globals.hGlobals.cpp $(CodeDefined)$(UserDefined)被-U和-D選項的代碼用於創建另一個.o文件:

NT_FFT_Decomp.o : $(GlobalsLib) $(GlobalsInc) $(NT_DecompLib) $(NT_DecompInc) 
     g++ -c -Wall $(CodeDefined) $(UserDefined) $(NT_DecompLib) -std=c++0x -o NT_FFT_Decomp.o 

(NT_DecompLib) $(NT_DecompInc)也是到f爾斯。請注意,我必須在g ++命令中添加相同的選項。反正有嗎?

+3

頭不編譯,所以你不能只編譯Global.h。每次更改標題時,都應重新編譯整個項目,以確保所有源代碼都使用相同版本的標頭進行編譯。 – 2013-05-14 19:15:19

+0

你應該使用宏作爲編譯器(所以'CXX = g ++'作爲宏定義,然後'$(CXX)'代替命令行中的'g ++'),以及它的標誌(通常是'CXXFLAGS = -Wall -std = C++ 0x'作爲宏定義,然後在命令行中使用'$(CXXFLAGS)')。這意味着你可以改變標誌一次(如果需要的話在命令行上)並且它改變爲完全調用'make'。 – 2013-05-14 23:30:27

+0

我已經做到了。當我發佈這個問題時,我只是改變了他們 – ProWi 2013-05-15 13:54:20

回答

0

不,這不是標頭的工作原理。

標題不是單獨的編譯單元。如果你通過-E標誌(我認爲)預編譯你的所有文件,這可能會更有意義。這會給你帶來一堆.i(我認爲)將被實際編譯的文件。請注意,標題現在已消失,但其內容分散在不同的源文件中。這就是你實際上每次都要重新編譯的東西。

有一些方法可以最大限度地減少源代碼重新編譯。例如這樣的情況:

foo.h中

int foo = 1; 

可以變成這樣:

foo.h中

extern int foo; 

Foo.cpp中

int foo = 1; 

所以你現在可以改變的值而不重新編譯。

但不幸的是,這聽起來像是你的標題太大了。如果你把所有內容都放在一個頭文件中,你將會進行大量的重新編譯。更具體的因素,這可能更容易避免。

也可以使用precompiled headers來減少編譯時間。我從來沒有編程過,但他們解決了我所理解的這個問題。