与静态库链接的共享库:重定位错误

时间:2012-10-20 14:20:26

标签: static linker shared-libraries gfortran fpic

我想用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中未提及此标志。

问题是来自编译器还是来自我尝试链接不同对象的方式?知道如何解决这个问题吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

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

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