Qt上的PRECOMPILED_HEADER和Subdirs模板

时间:2009-11-13 04:40:24

标签: c++ qt4

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

为了加快编译时间,我想使用预编译的头文件,发现在每个子项目中使用PRECOMPILED_HEADER可以解决这个问题,但是,每个项目都会单独编译预编译的头文件(而且这是最慢的一步)。

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

此致

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

不幸的是没有官方的方式。 你可以使用一些黑客来至少获得基本的PCH支持。

我用过

PRECOMPILED_HEADER = ../includes.h

在一个只创建.pch的项目中,然后在一些常见的.pri文件中为实际项目“模拟”PRECOMPILED_HEADER的下半部分。例如。与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选项。

答案 2 :(得分:0)

如果每个标题都将单独编译为自己的pch,那么这可能会起作用。 不幸的是,据我所知,在c ++项目中,预编译头只有一个转换单元,可以在每个项目中全局使用。 好吧,你可以为你的所有项目使用一个全局文件,但这是有效的:这可能会导致构建时间增加,因为每次预编译头都被更改时,一切都必须重建。

答案 3 :(得分:0)

只是一个建议 - 你可能想尝试使用cmake。它确实具有qt和pch支持,并且它当前的pch支持遭受同样的问题。与pch相关的宏有一个单独的易于理解的文件,并且可以重写为只为一个大的pch文件执行许多子文件夹。这就是我打算为我的qt项目解决同样问题的方法。

答案 4 :(得分:0)

如果您使用的是qmake.exe,则无法执行此操作。 qmake二进制文件内置了标志,表示每个项目的CREATE(-Yc)pch。没有办法把它剪掉。