我正在为 Android 移植一个大型 C++Visual Studio项目GCC。由于文件数量众多,编译时间非常缓慢。我想设置一个预编译的头文件,但我发现GCC 文档令人困惑。
我有一个stdafx.h文件,它应该是预编译头文件的基础,并且是所有.cpp源代码中的第一个包含文件。有人知道我需要添加什么才能完成Android.mk这项工作吗?
我正在为 Android 移植一个大型 C++Visual Studio项目GCC。由于文件数量众多,编译时间非常缓慢。我想设置一个预编译的头文件,但我发现GCC 文档令人困惑。
我有一个stdafx.h文件,它应该是预编译头文件的基础,并且是所有.cpp源代码中的第一个包含文件。有人知道我需要添加什么才能完成Android.mk这项工作吗?
有同样的问题,所以有一个解决方案。首先,您似乎无法通过更改 android.mk 文件来做到这一点,您应该在 ndk 构建的系统中更改文件,但这并不是很危险 %)。该解决方案在 r8b NDK 上进行了测试。所以:
# 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___________________________)
万一
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)