2013-05-14 320 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来减少编译时间。我从来没有编程过,但他们解决了我所理解的这个问题。