关于这个问题的背景是:我的项目(C ++语言)包含太多文件,包括boost,thrift,zookeeper等。现在编译持续时间太长了。
如您所知,Visual Studio支持预编译头,因此支持GCC。因为我使用automake来管理Make过程,所以我想要的是automake是否支持预编译头文件?如果是这样,我该如何编写automake文件?
等待并获得答案。
答案 0 :(得分:1)
整件事不是关于automake,而是关于编写makefile。
实际上,您可以尝试使用.gch,但有限制因素:
stdafx.h
)CFLAGS
来编译所有来源这是一项新功能。您希望在configure.ac
在Makefile.am
中编写规则,将其命名为stdafx.gch:
。如果不支持gch
,请将其设为空:
stdafx.gch: stdafx.h
$(OPTIONAL_COMPILE_GCH)
.PHONY: $(OPTIONAL_STDAFX_GCH)
让_OBJECTS
依赖stdafx.gch
:
$(foo_SOURCES:.cpp=.$(OBJEXT)): stdafx.gch
# or (is it documented var?)
$(foo_OBJECTS)): stdafx.gch
Youc可以使用记录的CXXCOMPILE命令确保所有CXXFLAGS都相同。
在configure.ac
if ...; then
[OPTIONAL_COMPILE_GCH='$(CXXCOMPILE) -c -o $@ $<']
[OPTIONAL_STDAFX_GCH=]
else
[OPTIONAL_COMPILE_GCH=]
[OPTIONAL_STDAFX_GCH='stdafx.gch']
fi
AC_SUBST(OPTIONAL_COMPILE_GCH)
AC_SUBST(OPTIONAL_STDAFX_GCH)
当.gch
间接使用的任何头文件被修改时,您希望重新编译stdafx.h
。
然后您可以添加不执行任何操作的stdafx.cpp
,但包括stdagx.h
并使.gch
依赖于stdafx.o
。这样,依赖关系跟踪将由automake
管理,但是存在问题:
stdafx.o
本身可以使用.gch
来更快地编译,但是如果我们添加这样的依赖项,它将是循环的。我找到解决方案并不容易。
以下是使用状态文件解决此问题的示例:https://gist.github.com/basinilya/e00ea0055f74092b4790
理想情况下,我们会覆盖stdafx.o
的编译命令,因此首先创建.gch
,然后运行标准的automake编译,但automake不会按原样使用$(CXXCOMPILE)
。它从中创建了一个复杂的配方(它取决于automake版本):
另一种解决方案是直接使用gcc依赖关系跟踪:
stdafx.h.gch: stdafx.h
g++ -MT stdafx.h.gch -MD -MP -MF .deps/stdafx.Tpo -c -o stdafx.h.gch stdafx.h
mv .deps/stdafx.Tpo .deps/stdafx.Po
-include .deps/stdafx.Po
默认情况下,如果使用预编译头,gcc -MD
将不会将头文件列表放入生成的依赖项文件中,只需.gch
。可以选择解决此问题:-fpch-deps
(see bug),但默认行为可能并不坏:如果只有.gch
取决于标题,则make会有减少工作量。