【问题标题】:How to use precompiled headers in Android NDK project?如何在 Android NDK 项目中使用预编译头文件?
【发布时间】:2011-07-06 06:22:56
【问题描述】:

我正在将一个用于 Android 的大型 C++ 项目从 Visual Studio 移植到 GCC。由于文件数量众多,编译时间非常缓慢。我想设置一个预编译的头文件,但我发现GCC documentation 令人困惑。

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

【问题讨论】:

  • 不是预编译的头文件,预编译的源文件怎么样?试试ccache
  • 我用基于MSBuild. 的简单构建系统替换了NDK 提供的构建系统。添加对预编译头文件的支持很容易,因为您可以控制文件的放置位置和选项被使用。完整构建时间从 3 分钟减少到 1 分钟。如果有人成功使用Android.mk,我会留下问题
  • 如果您可以选择切换到 vs-android,我设法让预编译的头文件在其中工作。 See here 获取说明。

标签: android gcc android-ndk precompiled-headers


【解决方案1】:

遇到了同样的问题,所以有一个解决方案。首先,您似乎无法通过更改 android.mk 文件来做到这一点,您应该在 ndk 构建的系统中更改文件,但这不是很危险 %)。该解决方案在 r8b NDK 上进行了测试。所以:

  • 将以下代码添加到 /build/core/build-binary.mk 脚本的 # Build the sources to object files 之前:
#precompiled 助手: ifeq ($(TARGET_ARCH_ABI),x86) $(调用 set-src-files-target-cflags,$(LOCAL_PCH),) 别的 $(调用 set-src-files-target-cflags,$(LOCAL_PCH),-mthumb) 万一 # 构建 PCH # 获取-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 $(调用 compile-cpp-source,$(LOCAL_PCH),$(LOCAL_BUILT_PCH).gch) # 所有的obj文件都依赖于PCH $(foreach src,$(过滤器 $(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) 别的 $(call ndk_log, ___________________________NO PCH for this module___________________________) 万一
  • 将以下行插入模块的 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 就可以了。
  • 有没有办法用cmake+ndk启用预编译头文件?
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 2012-12-02
  • 2022-09-26
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多