2012-08-29 107 views
2

编译CPP假设你有2个文件:与预编译头

  • A.h
  • A.cpp,其中A.cpp包括A.h

你预编译头A.h.gch和删除A.h

有2个文件:

  • A.cpp
  • A.h.gch

你怎么编译一个最终产品,采用G ++?

在我的情况下,g++是抱怨.h文件无处可查。

+8

“删除A.h”不要这样做。预编译头文件不会*替换原文。 –

+0

用于预编译头文件的编译器命令行和用于编译最终产品的命令行是什么?我怀疑有不同之处导致'g ++'拒绝使用预编译头文件。 –

回答

1

我不是专家,但是从Wikipedia

GCC只能使用预编译的版本,如果相同的编译器开关设置当标题被编译为它可能最多只有一个使用。

我已经试过:

g++ a.h 
rm a.h 
g++ -c a.cpp 

如果G ++与使用它,你可以看到:

g++ -H -c a.cpp 

! a.h.gch 
a.cpp 
1

我认为G ++会检查标题的日期,看看gch已经过时了。 令我惊讶的是,事实并非如此。我可以修改和重命名标题,并且仍然可以编译cpp。

如果某些参数与gch创建时不同,编译将失败。 因此,我认为您的编译失败是因为至少GCC precompiled header docs中提到的条件之一未得到满足。

如果您经常在不同的编译配置之间切换,则可以使用包含每个配置的pch的目录,如该文档中所述。

如果您只是想确保/如果使用了pch,请使用-Winvalid-pch选项,并确保在每次更改标头后更新pch。