我有一个很大的Qt项目,分成几个静态库(大约70个)和一个应用程序,为此我使用带有子模板的.pro文件。
为了加快编译时间,我想使用预编译的头文件,发现在每个子项目中使用PRECOMPILED_HEADER可以解决这个问题,但是,每个项目都会单独编译预编译的头文件(而且这是最慢的一步)。
有一种方法可以在子目录模板中包含的所有子项目之间“共享”预编译头,因此预编译头可以构建一次,并且可以被所有子项目使用吗?
此致
答案 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
您可能遇到不同的问题,例如
答案 2 :(得分:0)
如果每个标题都将单独编译为自己的pch,那么这可能会起作用。 不幸的是,据我所知,在c ++项目中,预编译头只有一个转换单元,可以在每个项目中全局使用。 好吧,你可以为你的所有项目使用一个全局文件,但这是有效的:这可能会导致构建时间增加,因为每次预编译头都被更改时,一切都必须重建。
答案 3 :(得分:0)
只是一个建议 - 你可能想尝试使用cmake。它确实具有qt和pch支持,并且它当前的pch支持遭受同样的问题。与pch相关的宏有一个单独的易于理解的文件,并且可以重写为只为一个大的pch文件执行许多子文件夹。这就是我打算为我的qt项目解决同样问题的方法。
答案 4 :(得分:0)
如果您使用的是qmake.exe,则无法执行此操作。 qmake二进制文件内置了标志,表示每个项目的CREATE(-Yc)pch。没有办法把它剪掉。