【问题标题】:DMD2 fails to compile shared library on Linux, amd64DMD2 无法在 Linux、amd64 上编译共享库
【发布时间】:2016-10-02 08:17:36
【问题描述】:

我一直在 32 位机器上编程,直到最近,我升级到了 64 位机器。我在 xubuntu 16.04 (amd64) 上使用最新版本的 DMD (amd64)。

在升级之前,我可以使用dmd -shared 'FILES' 轻松编译共享库,但现在,它给出了错误。 我有一个名为 q.d 的文件:

module q;

export extern(C) int abcd(){
    return 4;
}

现在当我执行dmd -shared 'q.d' 时,我得到了这个:

nafees@OptiPlex-755:~/Desktop/temp$ dmd -shared q.d
/usr/bin/ld: q.o: relocation R_X86_64_32 against `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC
q.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
--- errorlevel 1

当我这样做时dmd -shared -fPIC q.d:

nafees@OptiPlex-755:~/Desktop/temp$ dmd -shared -fPIC q.d
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libphobos2.a(exception_224_3b4.o): relocation R_X86_64_32 against `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC
/usr/lib/x86_64-linux-gnu/libphobos2.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
--- errorlevel 1

如何编译?

编辑:如果我使用 -m32 标志,库编译得很好。

【问题讨论】:

  • 可能是因为周围有缓存的东西,你试过--force吗?另外,我记得在安装hardening-wrapper 时遇到了这个问题。删除它为我修复了它。
  • @weltensturm 我试着做dmd -shared --force q.d,但它说--force 是一个无法识别的开关。而且我没有安装 hardening-wrapper。

标签: linux linker-errors d


【解决方案1】:

哦,我才意识到我知道这个问题,很抱歉我花了这么长时间才意识到这一点。

您只需要针对共享库 Phobos 进行编译,以使共享库为 64 位。

dmd -shared q -m64 -fPIC -defaultlib=libphobos2.so

-defaultlib 开关告诉它使用备用库。通过指定.so(与.a 文件的默认静态链接相反),它使用共享库——恰好也使用-fPIC 编译,所以它都是兼容的。

这里的其他优点之一是可以在所有共享对象和 D 可执行文件之间共享一个运行时,这意味着当您将它们全部分发时,很多东西就可以工作(尽管请注意,您可能还需要编译加载它的程序所以也可以使用-defaultlib 开关)。在 32 位上,无论如何都不会使用这些选项构建库......但结果是在某些情况下您可以看到多个定义的链接错误。

要注意的一件事是libphobos2.so 文件现在也是运行时依赖项,请务必将其与您自己的库构建一起分发。您可能需要设置 LD_LIBRARY_PATH 或全局安装它以使程序正确启动,就像任何其他库一样(您可能也想对其进行版本控制)

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2011-05-08
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多