【问题标题】:Our Android static library is in wrong format我们的 Android 静态库格式错误
【发布时间】:2017-08-16 07:01:57
【问题描述】:

我们在 armeabi-v7a 上创建了带有 hugin 应用程序的静态库,并尝试使用 Cmakelist 将它与我们在 Android 中的共享库连接起来。我们可以毫无问题地看到库和他的头文件,但是当我尝试编译它时,它失败并出现以下错误:

构建命令失败。

执行进程时出错

....\cmake\3.6.3155560\bin\cmake.exe 带有参数 {--build ....\OpenCVExample-master\app.externalNativeBuild\cmake\debug\arm64 -v8a --target native-lib}
[1/2] 构建 CXX 对象 CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o

[2/2] 链接 CXX 共享库 ........\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so 失败:cmd.exe /C "cd . && ....\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android --gcc-工具链=../../ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64 --sysroot=../../ndk-bundle/platforms/android-21/arch-arm64 -fPIC -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -g -DANDROID -ffunction-sections -funwind -tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -frtti -fexceptions -std=gnu++11 -O0 -fno -limit-debug-info -O0 -fno-limit-debug-info -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-警告 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,lib native-lib.so -o ........\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native -lib.cpp.o ../../../../src/main/jniLibs/arm64-v8a/libhugin.a ../../../../src/main/jniLibs/arm64 -v8a/libopencv_java3.so -lm "....\ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libgnustl_static.a" && cd ."

../../../../src/main/jniLibs/arm64-v8a/libhugin.a:添加符号时出错:文件格式错误

clang++.exe:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

ninja:构建停止:子命令失败。

我们知道我们的设备使用 arm64-v8a ABI,但是我们在将静态库编译到这个架构时遇到了严重的问题,所以我们使用 armeabi-v7a。根据下面的这篇文章,它应该是兼容的。

Is arm64-v8a compatible with armeabi-v7a?

您知道我们的静态库或项目有什么问题吗?非常感谢

【问题讨论】:

  • 说支持 arm64-v8a 的设备可以运行 armeabi-v7a 代码并不意味着单个应用程序可以使用这两种类型的代码。

标签: android static-libraries abi


【解决方案1】:

armeabi-v7a apk 将在 arm64 平台上运行;但要编译成 arm64 apk,需要 arm64 lib 编译成 arm64 app ( apk )

【讨论】:

    【解决方案2】:

    我在 aarch64 的 clang 中遇到了类似的问题 在我的情况下,静态库是使用启用的 lto 编译的 - 我的 cmake 中有以下行

    target_compile_options(addrlib PRIVATE -flto=thin)
    

    我建议您确认已为静态库禁用 LTO

    另外,您可能想确认静态库 src/main/jniLibs/arm64-v8a/libhugin.a 目标架构与您的共享库架构相同 你可以试试下面的方法

    # from src/main/jniLibs/arm64-v8a/
    mdkir test
    cd test
    ar -x ../libhugin.a
    # you would get some amount of object files from the static lib
    file <object file name>.o
    <object file name>.o: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped
    

    另外,请看这里How to see the compilation platform of a static library file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多