DMD2无法在Linux上编译共享库,amd64

时间:2016-10-02 08:17:36

标签: linux linker-errors d

我一直在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标志,那么库编译得很好。

1 个答案:

答案 0 :(得分:2)

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

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

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

-defaultlib开关告诉它使用备用库。通过指定.so(与具有.a文件的默认静态链接相对),它使用共享库 - 恰好也使用-fPIC进行编译,因此它完全兼容

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

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