使用gcc使用-D选项编译多个文件

时间:2013-05-14 17:46:31

标签: c++ gcc

我有一个包含多个.cpp和.h文件的项目。我有一个名为Globals.h的文件,它包含在所有.cpp文件中。 现在编译这个文件时我使用了一些-D选项。这些选项不仅影响所有文件,而且影响Globals.h。

在我的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)也是文件的路径。请注意,我必须在g ++命令中添加相同的选项。反正有吗?

1 个答案:

答案 0 :(得分:0)

不,这不是标头的工作方式。

标题不是单独的编译单元。如果您通过-E标志(我认为)预先编译所有文件,这可能更有意义。这将为您留下一堆实际编译的.i(我认为)文件。请注意,标题现已消失,但其内容分布在不同的源文件中。这就是你每次实际需要重新编译的内容。

有一些方法可以最大限度地减少源重新编译。例如这种情况:

foo.h中

int foo = 1;

可以变成这一个:

foo.h中

extern int foo;

Foo.cpp中

int foo = 1;

因此,您现在可以在不重新编译的情况下更改foo的值。

但遗憾的是,听起来你的标题太大了。如果你将所有内容都放在一个标题中,那么你将会进行大量的重新编译。更具体的因素,这可能更容易避免。

另外(或者?)使用precompiled headers来减少编译时间。我从来没有和他们一起编程,但他们解决了我理解的这个问题。