【问题标题】:How to resolve "Relocations in Generic ELF" during ndk-build?如何在 ndk-build 期间解决“通用 ELF 中的重定位”?
【发布时间】:2017-01-25 19:03:52
【问题描述】:

我正在尝试使用独立工具链为具有自己的构建过程的项目构建静态库,然后我将其与 C++ 库一起包装并暴露给 Android(使用 ndk-build 编译)。但是,在 ndk-build 步骤中,我收到以下错误:

➜  jni /Users/chrisfosterelli/Library/Android/sdk/ndk-bundle/ndk-build                    
[arm64-v8a] Compile++      : wrapper <= wrapper.cpp
In file included from /Users/chrisfosterelli/workspace/android/jni/wrapper.cpp:9:
In file included from ../prebuild/include/valhalla/meili/universal_cost.h:7:
In file included from ../prebuild/include/valhalla/sif/dynamiccost.h:4:
In file included from ../prebuild/include/valhalla/baldr/directededge.h:5:
../prebuild/include/valhalla/baldr/graphconstants.h:432:11: warning: 21 enumeration values not handled in switch: 'kRoad', 'kRamp', 'kTurnChannel'... [-Wswitch]
  switch (use) {
          ^
1 warning generated.
[arm64-v8a] SharedLibrary  : libwrapper.so
/Users/chrisfosterelli/Library/Android/sdk/ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: /Users/chrisfosterelli/workspace/android/jni/../prebuild/libvalhalla_meili.a(libvalhalla_meili_la-map_matcher_factory.o): Relocations in generic ELF (EM: 62)
[...above message repeated many times...]
/Users/chrisfosterelli/workspace/android/jni/../prebuild/libvalhalla_meili.a: error adding symbols: File in wrong format
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/Users/chrisfosterelli/workspace/android/obj/local/arm64-v8a/libwrapper.so] Error 1
➜  jni ls /Users/chrisfosterelli/Library/Android/sdk/ndk-bundle/

据我所知,此错误表明我正在尝试混合和匹配针对不同架构编译的二进制文件。但是,据我所知,该库是正确的架构:

root@eacbdb1c0e46:/meili/meili2/newtest# ar x libvalhalla_meili.a 
root@eacbdb1c0e46:/meili/meili2/newtest# file libvalhalla_meili_la-map_matcher_factory.o 
libvalhalla_meili_la-map_matcher_factory.o: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped
root@eacbdb1c0e46:/meili/meili2/newtest#

FWIW,这些是我目前的Application.mk,

APP_STL := c++_static
APP_CPPFLAGS := -frtti -std=gnu++11 -D_GLIBCXX_USE_C99
APP_CPPFLAGS += -fexceptions
NDK_TOOLCHAIN_VERSION := clang
APP_LDFLAGS := -latomic
APP_PLATFORM := android-21
APP_ABI := arm64-v8a

和Android.mk,

LOCAL_PATH := $(call my-dir)

# static library info
include $(CLEAR_VARS)
LOCAL_MODULE := libvalhalla_meili
LOCAL_SRC_FILES := ../prebuild/libvalhalla_meili.a
LOCAL_EXPORT_C_INCLUDES := ../prebuild/include
include $(PREBUILT_STATIC_LIBRARY)

# wrapper info
include $(CLEAR_VARS)
LOCAL_C_INCLUDES += ../prebuild/include
LOCAL_MODULE    := wrapper
LOCAL_SRC_FILES := wrapper.cpp
LOCAL_STATIC_LIBRARIES := libvalhalla_meili
include $(BUILD_SHARED_LIBRARY)

任何想法如何解决这个问题?我已经尝试了很多事情,但所有这些都会导致更多(更晦涩)的错误,所以我希望这里有人能指出我正确的方向!

【问题讨论】:

    标签: android c++ android-ndk cross-compiling ndk-build


    【解决方案1】:

    我发现了这个问题,但我希望我有一个更有洞察力的答案。显然,构建过程创建了两个库文件。我检查的当然是 ARM64。但是,我实际复制到 Android 设备的是 x86。

    因此,错误消息是正确的,库文件也是正确的,但涉及的文件不止一个。如果您遇到同样的问题并且很确定您的库是 ARM64,请仔细检查这实际上是被编译到 ndk 构建中的同一个文件!

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 2018-12-08
      • 2018-12-30
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      相关资源
      最近更新 更多