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

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

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

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

而现在当我做dmd -shared 'q.d' ,我得到这个:

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

当我做dmd -shared -fPIC qd

 nafees@OptiPlex-755:~/Desktop/temp$ dmd -shared -fPIC qd /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或者将其全局安装,以便程序正常启动,就像任何其他库一样(您也可能想要对其进行版本化)