2016-12-30 1 views
0

안드로이드 API 19를 타겟으로 안드로이드 NDK r13b를 사용하여 libcurl 7.50.3의 arm64 버전을 빌드하려고합니다. 나는 armv7을 작동시킬 수 있었지만 arm64로 계속 오류가 발생했습니다.안드로이드 arm64 용 libcurl 빌드

LIBS="-ldl -lssl -lcrypto" ./configure \ 
--disable-ftp \ 
--disable-file \ 
--disable-ldap \ 
--disable-dict \ 
--disable-telnet \ 
--disable-gopher \ 
--disable-tftp \ 
--disable-manual \ 
--disable-shared \ 
--disable-imap \ 
--disable-pop3 \ 
--disable-rtsp \ 
--disable-smb \ 
--disable-smtp \ 
--enable-threaded-resolver \ 
--enable-ipv6 \ 
--with-ssl=${SSL_DIR} \ 
--host=aarch64-linux-android \ 
--target=aarch64-linux-android \ 

그리고 만들

NDK_ROOT="/opt/android-ndk-r13b" 
export SYSROOT="${NDK_ROOT}/platforms/android-19/arch-arm" 
export CPPFLAGS="-I${SYSROOT}/usr/include --sysroot=${SYSROOT}" 
export CFLAGS="--sysroot=${SYSROOT}" 
export CC=$(${NDK_ROOT}/ndk-which gcc) 
export LD=$(${NDK_ROOT}/ndk-which ld) 
export CPP=$(${NDK_ROOT}/ndk-which cpp) 
export CXX=$(${NDK_ROOT}/ndk-which g++) 
export AS=$(${NDK_ROOT}/ndk-which as) 
export AR=$(${NDK_ROOT}/ndk-which ar) 
export RANLIB=$(${NDK_ROOT}/ndk-which ranlib) 

그리고 내 구성 호출 :이 내 수출 플래그입니다. 나는 호스트와 타겟을 arm-linux-androideabi로 설정하려고했지만 동일한 오류가 계속 발생한다. config.log에 따르면

configure:4488: ./conftest 
./configure: line 4490: ./conftest: cannot execute binary file: Exec format error 
configure:4492: $? = 126 
configure:4499: error: in `/home/sossisos/build_curl_android/curl_7.50.3': 
configure:4501: error: cannot run C compiled programs. 
If you meant to cross compile, use `--host'. 
See `config.log' for more details 

내가 누락 된 것이 있습니까? 나는 어떤 표적이나 주인이 사용하는지 오해 했습니까?

+0

Autotools를 사용할 때 크로스 컴파일에'--target'을 사용해야한다고 생각합니다. '--host'는 여러분이 구축하고있는 머신입니다. Host = Target (Aarch64 시스템에 빌드 중) 인 경우, 둘 중 하나를 지정하지 마십시오. '--target = aarch64-linux-android'는 유효한 타겟이 아니며'--host = aarch64-linux-android'는 아마도 잘못되었을 수 있습니다. 내가 아는 한, [Autotools에서 유효한 세 쌍둥이를 말할 수있는 방법이 없습니다] (https://lists.gnu.org/archive/html/autoconf/2015-02/msg00006.html). [Autoconf로 ARM을위한 크로스 컴파일] (http://stackoverflow.com/q/15234959)도 참조하십시오. – jww

+3

올바르지 않습니다. --build는 실행중인 시스템이고, --host는 컴파일 된 프로그램이 실행될 시스템이고 --target은 크로스 컴파일러를 빌드하는 데 사용됩니다. 전체 설명은 https://blog.flameeyes.eu/2009/01/the-canonical-target/에서 내 오래된 블로그 게시물을 참조하십시오. –

+0

디에고가 말한 것에 덧붙여, 성공하려면 연결을 위해'SYSROOT'가'android-21/arch-arm64'를 가리 키도록 변경해야합니다. (이것은 다른 아키텍처에서 API 19를 지원하는 데는 문제가되지 않으며, ABI가 해당 버전에 나온 이후 API 21보다 적은 것을 실행하는 arm64 장치는 없습니다.) – mstorsjo

답변

3

--host (arm64/android로 설정) 및 --build (시스템에 설정, 가능하면 x86_64-pc-linux-gnu)을 모두 호출해야합니다. 후자는 자동 감지되어야하지만 항상 그렇지는 않습니다. 이 방법으로 스크립트는 여러분이 크로스 컴파일을하고 있다는 것을 알게 될 것이며 그것이 만든 프로그램을 실행하려고 시도하지 않을 것입니다.

관련 문제