DMD2 无法在 Linux、amd64 上编译共享库
DMD2 fails to compile shared library on Linux, amd64
我一直在 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
文件的默认静态 link 相反),它使用共享库 - 恰好也是用 -fPIC
编译的,所以都是兼容的。
这里的其他优点之一是可以在所有共享对象和 D 可执行文件之间共享一个运行时,这意味着当您将它们全部分发时,很多事情都可以正常工作(但请注意,您可能还需要编译程序也用 -defaultlib
开关加载它)。在 32 位上,无论如何都没有使用这些选项构建库...但结果是在某些情况下您可以看到多个定义的 link 错误。
但要注意的一件事是 libphobos2.so
文件现在也是运行时依赖项,请务必将其与您自己的库构建一起分发。您可能需要设置 LD_LIBRARY_PATH
或全局安装它以使程序正确启动,就像任何其他库一样(顺便说一句,您可能也想对其进行版本控制)
我一直在 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
文件的默认静态 link 相反),它使用共享库 - 恰好也是用 -fPIC
编译的,所以都是兼容的。
这里的其他优点之一是可以在所有共享对象和 D 可执行文件之间共享一个运行时,这意味着当您将它们全部分发时,很多事情都可以正常工作(但请注意,您可能还需要编译程序也用 -defaultlib
开关加载它)。在 32 位上,无论如何都没有使用这些选项构建库...但结果是在某些情况下您可以看到多个定义的 link 错误。
但要注意的一件事是 libphobos2.so
文件现在也是运行时依赖项,请务必将其与您自己的库构建一起分发。您可能需要设置 LD_LIBRARY_PATH
或全局安装它以使程序正确启动,就像任何其他库一样(顺便说一句,您可能也想对其进行版本控制)