Как использовать предварительно скомпилированные заголовки в проекте Android NDK?

Я портирую большой проект C ++ с Visual Studio на GCC для Android. Из-за большого количества файлов время компиляции невелико. Я хотел бы настроить предварительно скомпилированный файл заголовка, но нашел документацию GCC сбивает с толку.

У меня есть stdafx.h файл, который должен быть основой предварительно скомпилированных заголовков и который является первым включенным файлом во всех .cpp исходниках. Кто-нибудь знает, что мне нужно добавить к Android.mk, чтобы эта работа работала?


person Meh    schedule 01.03.2011    source источник
comment
Как насчет предварительно скомпилированных исходных файлов вместо предварительно скомпилированных заголовков? Попробуйте ccache.   -  person fadden    schedule 01.03.2011
comment
Я заменил NDK предоставленную систему сборки на простую, основанную на MSBuild.. К ней было легко добавить поддержку предварительно скомпилированных заголовков, поскольку вы можете контролировать, куда помещаются файлы и какие параметры используются. Время полной сборки уменьшено с 3 до 1 минуты. Я оставляю вопрос открытым на случай, если у кого-нибудь получится Android.mk   -  person Meh    schedule 02.03.2011
comment
Если у вас есть возможность переключиться на vs-android, мне удалось заставить работать в нем предварительно скомпилированные заголовки. См. инструкции здесь.   -  person Qwertie    schedule 22.06.2012


Ответы (1)


Была такая же проблема, значит, решение есть. Во-первых, поскольку кажется, что вы не можете сделать это с изменением файлов 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 (сложно, но работает, когда в приложении много модулей).

Большинство решений взято отсюда: 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) 

person Sergey Leyko    schedule 29.11.2012
comment
Спасибо ребята!! Это действительно помогло. Что интересно, нам больше не нужно вносить изменения в файлы NDK. Я использую r13b NDK и заметил, что ваше решение включено в официальный NDK. Итак, я смог просто добавить LOCAL_PCH и LOCALCPPFLAGS + = -DPCH, и это сработало. - person Shammi; 02.02.2017
comment
Есть ли способ включить предварительно скомпилированные заголовки с помощью cmake + ndk? - person Pavel P; 17.02.2017