Ndk构建链接器错误:不兼容的目标

时间:2017-09-15 15:34:14

标签: android c++ curl build android-ndk

我正在尝试构建供Android应用程序使用的C ++库。这个C ++库使用curl库。在链接阶段发生以下错误:

     [exec] c:/Users/msavanovic/AppData/Local/Android/sdk/ndk-bundle/android-ndk-r15b/build//../toolchains/x86_64-4.9/prebuilt/windows-x86_64/bin/../lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_
64-linux-android/bin/ld.exe: error: g:/REPO/CPCAPI2/branches/b-msavanovic-x86_64_android_build-20170830/core/external/curl/curl-android/lib/libcurl.a(file.o): incompatible target

这两个库都是针对x86_64架构而构建的,目标是android平台21. Curl库是在linux上构建的,我的C ++库是在windows上构建的,但这并不重要,因为当目标架构是ARM时一切正常。

这是我的库的Application.mk文件:

APP_OPTIM := debug

APP_ABI := x86_64
APP_STL := gnustl_static
APP_PLATFORM := android-21

ifeq ($(APP_OPTIM),debug)
  APP_CFLAGS += -D_DEBUG=1 -DDEBUG=1 -g -gdwarf-2
else
  APP_CFLAGS += -DNDEBUG
endif

ifeq ($(ENABLE_NDK_PROFILER),true)
   APP_CFLAGS += -pg
endif

NDK_TOOLCHAIN_VERSION := 4.9

APP_CPPFLAGS += -std=c++0x
APP_CPPFLAGS += -Wno-deprecated-declarations
APP_CPPFLAGS += -Wno-write-strings

ifeq ($(NDK_TOOLCHAIN_VERSION),4.8)
  APP_CPPFLAGS += -Wno-literal-suffix
endif

APP_LDLIBS += -llog -lGLESv2 -lOpenSLES -lz

APP_LDFLAGS += --verbose

这就是我构建curl库的方式:

export PATH=$PATH:$ANDROID_NDKS/android-ndk-r15b/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin

export CROSS_COMPILE="/home/milos/Android/Sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android"
export CPPFLAGS="-D__ANDROID_API__=21 -I/$PRELIBS/include"
export LDFLAGS="-L/$PRELIBS/lib"
export AR=${CROSS_COMPILE}-ar
export AS=${CROSS_COMPILE}-as
export LD=${CROSS_COMPILE}-ld
export RANLIB=${CROSS_COMPILE}-ranlib
export CC=${CROSS_COMPILE}-gcc
export NM=${CROSS_COMPILE}-nm
export LIBS="-lssl -lcrypto"

CURLDEST=./result_libs

./configure --host=x86_64-linux-android --with-ssl --with-zlib --with-nghttp2 --enable-tls-srp --enable-static=yes --enable-shared=no --with-sysroot=$ANDROID_NDKS/android-ndk-r15b/platforms/android-21/arch-x86_64 --prefix=$CURLDEST

我用readelf和objdump检查了curl libs,它们都表明生成的curl库有x86_64架构。

  

readelf -h libcurl.a

     

文件:libcurl.a(libcurl_la-file.o)ELF标题:Magic:7f 45 4c 46   02 01 01 00 00 00 00 00 00 00 00 00班级:
  ELF64数据:2的补码,很少   endian版本:1(当前)OS / ABI:
  UNIX - System V ABI版本:0类型:
  REL(可重定位文件)机器:高级   Micro Devices X86-64版本:0x1输入   点地址:0x0程序头的开始:
  0(字节到文件)节头的开头:7376(字节   标志:0x0大小   header:64(bytes)程序头的大小:
  0(字节)程序头数量:0节的大小   headers:64(bytes)节标题数:17   节头字符串表索引:14

     

objdump -a libcurl.a

     

libcurl_la-file.o:文件格式elf64-x86-64 rw-r - r-- 0/0 944 Jan 1   01:00 1970 libcurl_la-file.o

当我使用相同的工具链x86_64和相同的Android平台目标21时,不确定为什么会出现不兼容的目标链接错误。非常欢迎任何帮助。

0 个答案:

没有答案