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

Meh*_*Meh 16 android gcc precompiled-headers android-ndk

我是从移植大C++项目Visual StudioGCC为Android.由于文件数量很多,编译时间是冰冷的.我想设置一个预编译的头文件,但我发现GCC文档令人困惑.

我有一个stdafx.h文件应该是预编译头的基础,这是所有.cpp源中的第一个包含文件.有人知道我需要添加什么Android.mk来使这项工作?

Ser*_*yko 10

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

  • 在以下代码中将以下代码添加到/build/core/build-binary.mk脚本中# Build the sources to object files:

    #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
    
  • 将以下行插入模块的android.mk:
    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) 

  • 有没有办法用cmake + ndk启用预编译头? (2认同)