【问题标题】:Compile shared library with link to other .so编译共享库并链接到其他 .so
【发布时间】:2012-12-13 09:03:06
【问题描述】:

我想在编译我自己的共享库时将现有共享库 (FlashRuntimeExtensions.so) 链接到我的 C 代码。但是无论我尝试什么,我总是会遇到同样的错误;文件格式错误。有人知道如何解决这个问题吗?

这是我的编译命令:

$ g++ -Wall ane.c FlashRuntimeExtensions.so -o aneObject
FlashRuntimeExtensions.so: could not read symbols: File in wrong format
collect2: ld gaf exit-status 1 terug

【问题讨论】:

  • $ file FlashRuntimeExtensions.so 这个命令的输出是什么?
  • @SirDarius:FlashRuntimeExtensions.so:ELF 32 位 LSB 共享对象,ARM,版本 1 (SYSV),动态链接,剥离
  • 你在为 ARM 进行(交叉)编译吗?
  • @tsurko 是的,但我不确定交叉编译。我只是想编译一个可以在Android设备上使用的共享库。

标签: c gcc g++ shared-libraries


【解决方案1】:

您的命令行尝试使用您的发行版中可用的本机 g++ 生成 x86 代码并将其链接到 ARM 代码。

这行不通。使用此处提供的 Android NDK:http://developer.android.com/tools/sdk/ndk/index.html

NDK 包含一组跨工具链(编译器、链接器等),可以在 Linux、OS X 和 Windows(使用 Cygwin)平台上生成本机 ARM 二进制文件。

【讨论】:

    【解决方案2】:

    一般.so 将使用-l 链接。

    例如,我们使用的 pthread -lpthread

    gcc sample.c -o myoutput -lpthread

    但根据@chill 的说法,您在命令中所做的只是正确的。

    我建议你参考以下链接。

    C++ Linker Error SDL Image - could not read symbols

    【讨论】:

    • OP 命令行本身是完全可以的。仅使用 -l 选项链接库(是否共享)没有这样的要求。
    • 嗯,当我尝试它时,它给了我找不到指定库的错误,即使我使用 -L 选项指定了路径。但这可能是从读取的兼容性问题链接。
    • 当我尝试使用 -m32 选项将其编译为 32 位库时,结果与之前的结果没有什么不同
    【解决方案3】:

    应该是架构不匹配。我曾经遇到过这个问题,我已经通过在同一目标平台上构建库来解决它,这很明显。如果您使用的是 linux 或 Unix 之类的操作系统,您可以通过文件命令查看,如果您使用的是 windows,您可以使用 Dependency Walker 看到。您需要确保所有库都与架构匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多