2011-03-01 1 views
15

큰 C++ 프로젝트를 Android 용 Visual Studio에서 GCC으로 이식하고 있습니다. 많은 수의 파일 때문에 컴파일 시간은 빙하기입니다. 미리 컴파일 된 헤더 파일을 설치하고 싶습니다만, GCC documentation이 혼란 스럽습니다.Android NDK 프로젝트에서 미리 컴파일 된 헤더를 사용하는 방법은 무엇입니까?

저는 stdafx.h 파일을 가지고 있습니다.이 파일은 미리 컴파일 된 헤더의 기본이어야하며 모든 .cpp 소스의 첫 번째 포함 파일입니다. 아무도 내가이 작품을 만들기 위해 Android.mk에 무엇을 추가해야 하는지를 알고 있습니까?

+0

나는 대체'NDK'가 MSBuild를'를 기반으로 단순한 하나 빌드 시스템을 제공했다. '파일을 넣을 위치와 사용 된 옵션을 제어 할 수 있기 때문에 프리 컴파일 된 헤더에 대한 지원을 쉽게 추가 할 수있었습니다. 전체 빌드 시간이 3 분에서 1 분으로 감소했습니다. 누구나'Android.mk'로 성공한 경우를 대비하여 열어 둔 질문을 남겨두고 있습니다. – Meh

+0

vs-android로 전환 할 수있는 옵션이 있다면, 미리 컴파일 된 헤더를 관리 할 수있었습니다. [여기] (http://qscribble.blogspot.ca/2012/05/precompiled-headers-in-vs-android.html)를 참조하십시오. – Qwertie

+1

미리 컴파일 된 헤더 대신 사전 컴파일 된 소스 파일은 어떻습니까? [ccache] (http://ccache.samba.org/)에 시도해보십시오. – fadden

답변

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 
  • 이 당신의 android.mk에 다음 줄을 삽입 모듈 :
 
    PCH_FILE := symroot/src/Prefix.h 
    LOCAL_PCH := $(PCH_FILE) 
    LOCAL_CPPFLAGS += -DPCH 

그래서 우리는 PRECO를 가진 우리의 모듈을 표시 -DPCH 컴파일러 플래그가있는 mpiled 헤더 (까다 롭지 만 응용 프로그램에 많은 모듈이있는 경우 작동).

솔루션의 대부분은 여기에서 가져온 것입니다 : 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) 

+0

감사합니다 !! 이것은 정말로 도움이되었습니다. 흥미롭게도 NDK 파일을 더 이상 변경할 필요가 없습니다. 나는 r13b NDK를 사용 중이며 귀하의 솔루션이 공식 NDK에 포함되어 있음을 발견했습니다. 그래서 LOCAL_PCH 및 LOCALCPPFLAGS + = -DPCH를 추가 할 수있었습니다. – Shammi

+1

cmake + ndk로 미리 컴파일 된 헤더를 활성화하는 방법이 있습니까? – Pavel