2016-10-02 55 views
2

我一直在32位机器上编程,直到最近,我升级到了64位。我在xubuntu 16.04(amd64)上使用最新版本的DMD(amd64)。DMD2无法在Linux上编译共享库,amd64

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

module q; 

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

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

[email protected]:~/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

[email protected]:~/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

这可能是因为缓存的内容,您是否尝试过'--force'?另外,我还记得安装了'hardening-wrapper'的问题。删除它为我固定。 – weltensturm

+0

@weltensturm我尝试过'dmd -shared --force q.d',但它说'--force'是一个无法识别的开关。我没有安装硬化包装。 – Nafees

回答

2

哦,我刚刚意识到我知道这个问题,对不起,我花了那么长时间才意识到它。

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

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

-defaultlib switch告诉它使用备用库。通过指定.so(与使用.a文件的默认静态链接相反),它使用共享库 - 它恰好也与-fPIC一起编译,因此它们都是兼容的。

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

要注意的一点是,libphobos2.so文件现在也是运行时依赖项,一定要将它与自己的库版本一起分发。您可能需要设置LD_LIBRARY_PATH或全局安装,以便程序正常启动,就像任何其他库一样(并且您可能想要对其进行版本升级)