c ++ automake预编译头文件支持centos

时间:2015-12-26 09:16:09

标签: c++ automake precompiled-headers

关于这个问题的背景是:我的项目(C ++语言)包含太多文件,包括boost,thrift,zookeeper等。现在编译持续时间太长了。

如您所知,Visual Studio支持预编译头,因此支持GCC。因为我使用automake来管理Make过程,所以我想要的是automake是否支持预编译头文件?如果是这样,我该如何编写automake文件?

等待并获得答案。

1 个答案:

答案 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版本):

更新2

另一种解决方案是直接使用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-depssee bug),但默认行为可能并不坏:如果只有.gch取决于标题,则make会有减少工作量。