我正在将一个大型C++项目从Visual Studio
移植到GCC
以在Android上使用。由于文件数量众多,编译时间非常漫长。我想设置预编译头文件,但我觉得 GCC文档很令人困惑。
我有stdafx.h
文件,它应该是预编译头文件的基础,并且是所有.cpp
源文件中包含的第一个文件。 有人知道我需要添加什么到Android.mk
才能使其正常工作吗?
我正在将一个大型C++项目从Visual Studio
移植到GCC
以在Android上使用。由于文件数量众多,编译时间非常漫长。我想设置预编译头文件,但我觉得 GCC文档很令人困惑。
我有stdafx.h
文件,它应该是预编译头文件的基础,并且是所有.cpp
源文件中包含的第一个文件。 有人知道我需要添加什么到Android.mk
才能使其正常工作吗?
我也遇到同样的问题,但是有个解决方案。首先,看起来你无法通过更改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
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)
MSBuild
的简单构建系统替换了NDK
提供的构建系统。由于可以控制文件放置位置和使用的选项,因此很容易添加对预编译头文件的支持。完整的构建时间从3分钟减少到1分钟。如果有人成功使用Android.mk
,我将保持问题开放。 - Meh