我正在为Android推出一个从Visual Studio
到GCC
的大型C ++项目。由于文件数量很多,编译时间是冰冷的。我想设置一个预编译的头文件,但我发现GCC documentation令人困惑。
我有stdafx.h
文件,该文件应该是预编译标头的基础,并且是所有.cpp
源中的第一个包含文件。有人知道我需要添加到Android.mk
以使其工作吗?
答案 0 :(得分:10)
有同样的问题,所以有一个解决方案。首先,因为你似乎无法通过更改android.mk文件来做到这一点,你应该在ndk构建的系统中更改文件,但这不是非常危险的%)。该解决方案在r8b NDK上进行了测试。所以:
# Build the sources to object files
之前将以下代码添加到/build/core/build-binary.mk脚本中:#precompiled helper: ifeq ($(TARGET_ARCH_ABI),x86) $(call set-src-files-target-cflags,$(LOCAL_PCH),) else $(call set-src-files-target-cflags,$(LOCAL_PCH),-mthumb) endif # Build 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)))) # Build PCH into obj directory LOCAL_BUILT_PCH := $(call get-pch-name,$(LOCAL_PCH)) $(call ndk_log, ___________________________Building pch '$(LOCAL_BUILT_PCH)'___________________________) # Build PCH $(call compile-cpp-source,$(LOCAL_PCH),$(LOCAL_BUILT_PCH).gch) # All obj files are dependent on the 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)\ ) # Files from now on build with PCH LOCAL_CPPFLAGS += -Winvalid-pch -include $(LOCAL_BUILT_PCH) # Insert PCH dir at beginning of include search path LOCAL_C_INCLUDES := \ $(LOCAL_OBJS_DIR) \ $(LOCAL_C_INCLUDES) else $(call ndk_log, ___________________________NO PCH for this module___________________________) endif
PCH_FILE := symroot/src/Prefix.h LOCAL_PCH := $(PCH_FILE) LOCAL_CPPFLAGS += -DPCH
因此我们将模块标记为具有-DPCH compilator标志的预编译头(很棘手,但在应用程序中有很多模块时可以工作)。
大部分解决方案都来自此处: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)