static - 与静态库链接的共享库 : relocation error

标签 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 中没有提到这个标志。 .

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

非常感谢您的帮助!

最佳答案

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

因此您不能将 libfgortran(静态)链接到您的共享对象。

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

关于static - 与静态库链接的共享库 : relocation error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989334/

相关文章:

c++ - 即使我与 -ldl 链接,Cmake 对符号 'dlsym@@GLIBC_2.2.5 的 undefined reference

c++ - 访问回调范围之外的变量c++

generics - Dart:每个子类都有不同的静态方法

c# - C#中静态类的反射

c++ - CMake 无法使用相对文件路径找到静态库

c++ - 使用外部模板时出现链接器错误

C++ 结构的多重定义

c++ - 共享库中全局静态变量的析构函数未在 dlclose 上调用

linux - 共享库如何知道它所在的位置?

c++ - 防止创建成员函数都是静态的类