如何在Android NDK项目中使用预编译头文件?

17

我正在将一个大型C++项目从Visual Studio移植到GCC以在Android上使用。由于文件数量众多,编译时间非常漫长。我想设置预编译头文件,但我觉得 GCC文档很令人困惑。

我有stdafx.h文件,它应该是预编译头文件的基础,并且是所有.cpp源文件中包含的第一个文件。 有人知道我需要添加什么到Android.mk才能使其正常工作吗?


1
不妨尝试使用预编译源文件,而非预编译头文件。可以试试ccache - fadden
我用基于MSBuild的简单构建系统替换了NDK提供的构建系统。由于可以控制文件放置位置和使用的选项,因此很容易添加对预编译头文件的支持。完整的构建时间从3分钟减少到1分钟。如果有人成功使用Android.mk,我将保持问题开放。 - Meh
如果你有切换到vs-android的选项,我成功地让预编译头在其中工作。请参阅此处的说明:http://qscribble.blogspot.ca/2012/05/precompiled-headers-in-vs-android.html。 - Qwertie
1个回答

10

我也遇到同样的问题,但是有个解决方案。首先,看起来你无法通过更改android.mk文件来解决问题,你应该在ndk构建系统中更改文件,但这并不是非常危险 %)。这个解决方案在r8b NDK上测试过。所以:

  • /build/core/build-binary.mk脚本中添加以下代码,放在# Build the sources to object files之前:
    #预编译帮助程序:
    ifeq ($(TARGET_ARCH_ABI),x86)
        $(call set-src-files-target-cflags,$(LOCAL_PCH),)
    else
        $(call set-src-files-target-cflags,$(LOCAL_PCH),-mthumb)
    endif
#构建PCH #
get-pch-name = $(strip \ $(subst ../,__/,\ $(eval __pch := $1)\ $(eval __pch := $(__pch:%.h=%.precompiled.h))\ $(__pch)\ ))
ifneq (,$(findstring DPCH,$(call module-get-c++-flags,$(LOCAL_MODULE)))) #将PCH构建到obj目录中 LOCAL_BUILT_PCH := $(call get-pch-name,$(LOCAL_PCH))
$(call ndk_log, ___________________________Building pch '$(LOCAL_BUILT_PCH)'___________________________)
#构建PCH $(call compile-cpp-source,$(LOCAL_PCH),$(LOCAL_BUILT_PCH).gch)
#所有的obj文件都依赖于PCH $(foreach src,$(filter $(all_cpp_patterns),$(LOCAL_SRC_FILES)),\ $($(LOCAL_OBJS_DIR)/$(call get-object-name,$(src)) : $(LOCAL_OBJS_DIR)/$(LOCAL_BUILT_PCH).gch)\ )
#从现在开始的文件都使用PCH构建 LOCAL_CPPFLAGS += -Winvalid-pch -include $(LOCAL_BUILT_PCH)
#将PCH目录插入到包含搜索路径的开头 LOCAL_C_INCLUDES := \ $(LOCAL_OBJS_DIR) \ $(LOCAL_C_INCLUDES) else $(call ndk_log, ___________________________此模块没有PCH___________________________) endif
  • 将以下行插入到您的模块的android.mk中:
    PCH_FILE := symroot/src/Prefix.h
    LOCAL_PCH := $(PCH_FILE)
    LOCAL_CPPFLAGS += -DPCH

因此,我们使用-DPCH编译器标志将我们的模块标记为具有预编译头文件(虽然有些棘手,但在应用程序中有很多模块时起作用)。

这个解决方案大部分是从这里得出的:http://code.google.com/p/android/issues/detail?id=25412

警告:在我对项目执行此操作后,它根本没有提高编译时间,并且我发现这在某些项目上使用gcc预编译头文件时会发生。目前还无法解释。

如果只想将某个文件包含到每个cpp文件中,请将以下行添加到android.mk中:

    PCH_FILE := $(LOCAL_PATH)/symroot/src/Prefix.h
    LOCAL_CPPFLAGS += -include $(PCH_FILE) 


谢谢大家!!这真的帮了我很多。 有趣的是,我们不再需要在NDK文件中做出修改。我正在使用r13b NDK,并注意到您的解决方案已经包含在官方NDK中。因此,我只需添加LOCAL_PCH和LOCALCPPFLAGS += -DPCH,就可以实现它。 - Shammi
2
有没有一种方法可以在cmake+ndk中启用预编译头文件? - Pavel P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接