我一直在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
或者将其全局安装,以便程序正常启动,就像任何其他库一样(您也可能想要对其进行版本化)