C++ Qt上的预编译_头和子文件模板

C++ Qt上的预编译_头和子文件模板,c++,qt4,C++,Qt4,我有一个很大的Qt项目,分为几个静态库(大约70个)和一个应用程序,为此,我使用了一个带有subdirs模板的.pro文件 为了加快编译时间,我想使用预编译头,并发现在每个子项目上使用预编译头可以做到这一点,但是,每个项目单独编译预编译头(这是最慢的步骤) 有一种方法可以在SubDRS模板?中包含的所有子项目之间“共享”预编译头,因此预编译头可以构建一次,并供所有子项目使用 关于如果每个标头将分别编译为其自己的pch,那么这可能会起作用。 不幸的是,据我所知,在C++项目中,只有一个翻译单元用于

我有一个很大的Qt项目,分为几个静态库(大约70个)和一个应用程序,为此,我使用了一个带有subdirs模板的.pro文件

为了加快编译时间,我想使用预编译头,并发现在每个子项目上使用预编译头可以做到这一点,但是,每个项目单独编译预编译头(这是最慢的步骤)

有一种方法可以在SubDRS模板?中包含的所有子项目之间“共享”预编译头,因此预编译头可以构建一次,并供所有子项目使用


关于

如果每个标头将分别编译为其自己的pch,那么这可能会起作用。 不幸的是,据我所知,在C++项目中,只有一个翻译单元用于每个项目可以全局使用的预编译头。
嗯,您可以对所有项目使用一个全局文件,但这是最有效的:这可能会导致生成时间增加,因为每次更改预编译头时,都必须重新生成所有文件。

只是一个建议-您可能希望尝试使用cmake。它同时支持qt和pch,并且它当前的pch支持也存在同样的问题。与pch相关的宏包含在一个单独的易于理解的文件中,并且可以重写,以便为多个子文件夹创建一个大型pch文件。这就是我打算为我的qt项目解决相同问题的方法。

经过一些实验后,我发现无法在子项目之间共享预编译的头文件。我认为缺少此功能的基本原理是,每个子项目都可能更改编译器/预处理器标志,这将使为一个子项目构建的预编译头与其他子项目不兼容


共享的预编译头对于一些简单的项目可能很有用,在这些项目中,编译器标志也是共享的,但我想检测和处理与此条件的偏差对qmake来说太麻烦了。

不幸的是,没有官方的方法。 不过,您可以使用一些黑客技术来至少获得基本的PCH支持

我曾经

PRECOMPILED_HEADER = ../includes.h
在一个项目中,只创建.pch,然后在实际项目的一些公共.pri文件中“模拟”预编译_头的后半部分。例如,在VS中,您可以使用以下内容:

QMAKE_CXXFLAGS += /FIincludes.h /Yuincludes.h /Fppath/to/1stproj/intdir/projname_pch.pch
#QMAKE_CXXFLAGS += /wd4651
QMAKE_LFLAGS += path/to/1stproj/intdir/projname_pch.obj
您可能会遇到不同的问题,例如:

  • 如果编译器标志差异过大(请参阅上面的wd4651)
  • 它也不适用于pdb文件的ootb。改用/Z7
  • 使用gcc时,您可能会遇到不兼容的-fPIC选项
  • 等等

如果您使用的是qmake.exe,则无法执行此操作。qmakebinary内置了标志,表示为每个项目创建(-Yc)pch。没有办法删掉它。

这个想法是预编译的头不会改变,我想把所有特定于Qt的东西都放在那里,别的什么都不放。但是Qmake有办法做全局文件吗?如果你解决了这个问题,我会对答案感兴趣。遗憾的是,我从来没有找到做这件事的方法