gpt4 book ai didi

linux - DMD2 无法在 Linux、amd64 上编译共享库

转载 作者:太空狗 更新时间:2023-10-29 12:12:04 28 4
gpt4 key购买 nike

我一直在 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 标志,库可以正常编译。

最佳答案

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

您只需要针对共享库 Phobos 进行编译,并在 64 位上创建共享库。

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

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

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

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

关于linux - DMD2 无法在 Linux、amd64 上编译共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39815142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com