0

我有一个包含多个 .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)and$(GlobalsInc)是文件的路径,Globals.handGlobals.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++ 命令中添加相同的选项。反正周围有吗?

4

1 回答 1

0

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

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

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

foo.h

int foo = 1;

可以变成这个:

foo.h

extern int foo;

foo.cpp

int foo = 1;

因此,您现在可以更改 的值而foo无需重新编译。

但不幸的是,听起来你的标题太大了。如果您将所有内容都放在一个标头中,您将进行大量的重新编译。更具体地考虑因素,这可能更容易避免。

另外(或替代地?)使用预编译的头文件来减少编译时间。我从来没有和他们一起编程,但我理解他们解决了这个问题。

于 2013-05-17T01:21:31.423 回答