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

C++ 使用gcc使用-D选项编译多个文件,c++,gcc,C++,Gcc,我有一个包含多个.cpp和.h文件的项目。我有一个名为Globals.h的文件,它包含在所有.cpp文件中。 现在在编译这个文件时,我使用了一些-D选项。这些选项不仅影响Globals.h,还影响所有文件 在我的makefile中,在编译每个文件时,我必须使用相同的-D选项。当然,当删除这些选项时,会出现一些“未定义”的错误 这意味着每次我更改其中一个选项时,我都必须重新编译整个项目。 有没有一种方法可以让我用这些选项只编译Globals.h 这是我的makefile中的一部分: 创建Globa

我有一个包含多个.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\u DecompLib)$(NT\u DecompInc)
也是文件的路径。注意,我必须在g++命令中添加相同的选项。这有什么关系吗?

不,头不是这样工作的

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

有一些方法可以最小化源代码重新编译。例如,这种情况:

福安

可以转换为以下内容:

福安

foo.cpp

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

但不幸的是,听起来你的头太大了。如果你把所有的东西都放在一个标题中,你将要进行大量的重新编译。更具体地说,这可能是可以避免的


另外(或者?)用于减少编译时间。我从来没有用它们编程过,但我知道它们解决了这个问题。

头文件没有编译,所以您不能只编译Global.h。每次更改标头时,您都应该重新编译整个项目,以确保所有源代码都是使用相同版本的标头编译的。您应该使用编译器的宏(因此
CXX=g++
作为宏定义,然后在命令行上用
$(CXX)
代替
g++
)及其标志(通常类似于
cxflags=-Wall-std=c++0x
作为宏定义,然后在命令行上使用
$(cxflags)
)。这意味着您可以更改一次标志(如果需要,在命令行上)它会随着
make
的完整调用而改变。我已经这样做了。我只是在发布这个问题时改变了它们
extern int foo;
int foo = 1;