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