【问题标题】:Linker error during .so file creation. Error: Function not Implemented.so 文件创建期间的链接器错误。错误:功能未实现
【发布时间】:2019-02-21 06:06:02
【问题描述】:

在创建“.so” 文件的链接阶段,“ld” 链接器正在标记一条错误消息。

我试图搜索它,但找不到任何具体的东西。此消息被标记为 “--trace” 链接器标志已启用。 “--trace” 转储链接步骤过程中使用的文件。平台是Windows

下面提到的是错误消息。在链接过程中多次出现此消息。 任何线索将不胜感激。

错误:

arm-linux-androideabi/bin\ld: error: dummy.so: write: Function not implemented**

【问题讨论】:

  • 在我的例子中,当我们向项目中添加大量代码并且生成的 .so 大小超过 2GB 时,它发生在使用 NDK19c 的 32 位目标上。 lld 生成较小的二进制文件也许这就是它起作用的原因。

标签: android android-ndk shared-libraries ld clang++


【解决方案1】:

最近也遇到了这个问题,它也只在 Windows 上进行调试构建时发生。我一直无法找到让 LD 链接器满意并解决错误的代码修复程序。

但是,我能够切换到使用 LLD LLVM 链接器并获得在 Windows 上再次运行的调试版本。切换后,LLD 链接器发现了一些 LD 似乎从未检测到的链接器错误。解决这些问题后,我能够再次成功构建。

为了切换到使用 LLD 链接器,我在构建中添加了以下链接器标志:

-fuse-ld=lld
-Wl,--no-threads

LLD 链接器在 NDK r18 中可用,因此您需要使用合适的 NDK 进行构建,否则无法识别标志。

我正在使用 CMake,所以我只是在我的共享库上的 target_link_libraries 声明的末尾添加了这些标志。

我添加了第二个标志“-Wl,--no-threads”,以禁用多线程链接,这显然在 Windows 上可能是一个问题并导致它挂起(有关更多信息,请参阅https://github.com/android-ndk/ndk/wiki/Changelog-r19)。

如果您使用的是 ndk-build,那么默认情况下应该已经禁用多线程链接(从 NDK r19b 开始)。

注意:我目前正在使用 NDK r19c 进行构建。最终,Android NDK 将默认切换到 LLD LLVM 链接器(估计为 r21)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多