我有一个包含多个.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.h
和Globals.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 ++命令中添加相同的选项。反正有吗?
答案 0 :(得分:0)
不,这不是标头的工作方式。
标题不是单独的编译单元。如果您通过-E
标志(我认为)预先编译所有文件,这可能更有意义。这将为您留下一堆实际编译的.i
(我认为)文件。请注意,标题现已消失,但其内容分布在不同的源文件中。这就是你每次实际需要重新编译的内容。
有一些方法可以最大限度地减少源重新编译。例如这种情况:
foo.h中
int foo = 1;
可以变成这一个:
foo.h中
extern int foo;
Foo.cpp中
int foo = 1;
因此,您现在可以在不重新编译的情况下更改foo
的值。
但遗憾的是,听起来你的标题太大了。如果你将所有内容都放在一个标题中,那么你将会进行大量的重新编译。更具体的因素,这可能更容易避免。
另外(或者?)使用precompiled headers来减少编译时间。我从来没有和他们一起编程,但他们解决了我理解的这个问题。