2017-05-09 1 views
1

그래서 안드로이드 용 ICU를 만드는 방법을 알아 내려고합니다. 처음에는 독립 실행 형 도구 체인으로 만들려고했지만 일부 전투 후에는 x86_64 아치 (다른 사람들과 시도하지 않았 음)에서이 작업을 수행 할 수있었습니다. 그러나 전 커스텀 빌드 시스템을 원하지 않기 때문에 툴 체인을 미리 빌드하는 방법을 결정하기로했습니다. 그리고 저는 그것이 매우 다른 행동을하는 것을 발견했습니다. 그것은 매우 이상합니다.안드로이드 NDK의 프리 빌더 툴 체인과 커스텀 툴 체인 컴파일러의 차이점은 무엇입니까?

ICU/소스/구성 --disable-공유 --enable-정적 --disable-dyload --disable-엑스트라 : 나는 실제로 독립형 도구 체인과 ICU를 구성 할 때 그래서 내 명령했다 --disable-tests --disable-samples --prefix =/icu/build --host = x86_64-linux-android --with-cross-build =/toplay/icu/icu_linux CC =/custom_toolchain/bin/clang CXX =/custom_toolchain/bin/clang ++ LD =/custom_toolchain/bin/x86_64-linux-android-ld AR =/custom_toolchain/bin/x86_64-linux-android-ar CFLAGS = "- fPIC -DANDROID -fdata-sections -ffunction-sections " CXXFLAGS ="- fPIC -DANDROID -frtti -fno-exceptions -fdata-sections -ffunctio N-섹션 "

은 그래서 가지는 모두 같은 명령이 있지만 모양을 사전 빌드 툴 체인 만 변경 컴파일러 및 도구 :

ICU/소스/--disable-공유 구성 할 - enable-static -disable-dyload --disable-extras --disable-tests --disable-samples --prefix =/icu/build --host = x86_64-linux-android --with-cross-build = toplay/icu/icu_linux CC =/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/clang CXX =/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/clang ++ LD =/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-ld AR =/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64 // bin/x86_64-linux-android-ar CFLAGS = "- fPIC -DANDROID -fdata-sections -ffunction 섹션 " CXXFLAGS ="- FPIC -DANDROID -frtti -fno-예외 -fdata 섹션 -ffunction 섹션 "

나는 매우 다른 구성 단계의 결과를 얻을 수 있습니다. 나는 there: 배치 어떤 그리고 독립형 도구 - 경우 (TLDR을 : 주요 DIFF는 크로스 컴파일 모드의 이해 할 수없는 사전 빌드 툴 체인의 경우 시스템에, 그것은 안드로이드에서 사용할 수 없습니다 strtod_l, nl_langinfo을 찾을 수 있어요) 체인은 초기에 ICU를 구축 할 수 있었고, 빌드 전 프로세스 구축 과정에서 결국 파산했습니다.

내 질문 : 프리 빌더 및 독립 실행 형 케이스의 컴파일러와 도구의 차이점과 사전 빌드에서 작동하도록 추가해야하는 플래그/설정은 무엇입니까?

+0

아치 특정 디렉토리에서'configure'를 실행하는 것이 유용하다는 것을 알았습니다. obj/local/armeabi-v7a/objs/i cu'을 작성한 다음 글로벌 **'ndk-build' **의 한 단계로 수행 할 수 있습니다. 여기 예제를 참조하십시오 : http://stackoverflow.com/a/42964186/192373 –

답변

2

이것은 예상되는 동작입니다. 나는 our bugtracker에 대답했다.

우리 Clang의 기본값은 x86 Linux를 대상으로하며 Android의 특성은 아닙니다. 타겟 플래그를 설정하는 것은 독립 실행 형 툴체인이 수행하는 많은 작업 중 하나입니다.

나는 어떤 문제를 해결하려고하는지 잘 모르겠습니다. autoconf로 작업하는 것이 무엇이든 본질적으로 함께 자갈로 만든 독립 실행 형 도구 체인이 될 것입니다. 이러한 종류의 시나리오를 처리하기 위해 독립 실행 형 툴체인이 전적으로 존재합니다.

여기에 특정 질문에 대답하려면 :

사전 빌드 및 독립 케이스와 나는 그것이 사전 빌드 경우에 작동하도록 추가 할 필요 플래그/설정에서 컴파일러와 툴의 차이는 무엇인가?

독립 툴체인은 다른 디렉토리 레이아웃 (그래서 컴파일러는 바이너리 유틸리티의 위치는 SYSROOT 및 STL을 추론 할 수있다)과 몇 가지 기본 플래그 (연타에 대한 -target 같은)와 미리 만들어진 툴체인입니다. 이 작업을 얻을 수 있다면, 당신은 단지 가능성이 디렉토리 구조를 -gcc-toolchain--sysroot의 무리 -isystem, -L 물건을 사용하는 대신 변경하여이 휠 (재창조 한 것입니다. 경우

"왜하지 않습니다 "안드로이드에서 많은 아키텍쳐와 더 많은 타겟 버전의 OS, 선택할 수있는 소수의 STL을 가지고 있다는 것을 기억해야한다. Clang이나 GCC도 현재 안드로이드의 모든 변형을 다룰 수있는 방법 (장기적으로 나는 그것을 바꿀 것으로 예상하지만, 그것은 the road이다.)

관련 문제