2012-10-20 199 views
2

我想用gfortran创建一个共享库,并将其与libgfortran的静态版本链接以实现可移植性。不幸的是,我没有设法适当地链接不同的对象。我已经找到了一些解决类似问题的帖子,但我无法弄清楚如何解决这个问题。与静态库链接的共享库:重定位错误

我的源文件全部使用-fPIC标志进行编译。当我尝试的对象与标志-shared-static-libgfortran链接,我得到了以下错误消息:

gfortran -shared -static-libgfortran file1.o file2.o file3.o -o "mynewlib.so" 
/usr/bin/ld: ../lib64/libgfortran.a(error.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC 
../lib64/libgfortran.a: could not read symbols: Bad value 
collect2: ld returned 1 exit status 

我使用gfortran 4.6.3,我从头开始编写我的服务器上。安装顺利进行,我没有更改标准配置。我在旧帖子中发现编译器应该配置为--with-pic,但在GCC manual中未提及此标志。

问题来自编译器还是来自我试图链接不同对象的方式?任何想法如何我可以解决这个问题?

非常感谢您的帮助!

回答

2

当您使用静态版本时,libgfortran未与-fPIC标志一起编译(因此它不包含位置独立代码)。

因此,您无法将libfgortran(静态)链接到您的共享对象。

我建议您正确打包库(例如,作为Debian或Ubuntu的.deb文件),并将gfortran添加到包的依赖项中。

+0

这是我的猜测,但是如何获得用'-fPIC'编译的'libgfortran'版本? – remek

+0

你可能会考虑从它的源代码编译GCC,并手动调整一些标志(可能用'../gcc-4.7/configure CFLAGS =' - fPIC'....),但我真的相信这是不值得的。 –

+0

有关我的问题的更多详细信息:我在安装了非常旧的GCC版本的服务器上共享此库,该服务器太旧无法编译我的代码。我刚刚安装了一个更新版本的GCC来解决这个问题,但是我的同事也必须能够访问共享版本的'libgfortran'。我认为拥有一个独立的共享库会更容易。你不想那样做?有什么选择?与他们分享'libgfortran'? – remek