【问题标题】:Shared library linked with static library: relocation error与静态库链接的共享库:重定位错误
【发布时间】:2012-10-20 14:20:26
【问题描述】:

出于可移植性原因,我想用 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中没有提到这个标志。

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

非常感谢您的帮助!

【问题讨论】:

    标签: static linker shared-libraries gfortran fpic


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是我的猜测,但是如何获得使用 -fPIC 编译的 libgfortran 版本?
    • 你可能会考虑从它的源代码编译 GCC,并手动调整一些标志(也许用../gcc-4.7/configure CFLAGS='-fPIC' ....),但我真的认为这不值得。
    • 有关我的问题的更多详细信息:我在安装了非常旧版本的 GCC 的服务器上共享此库,该版本太旧而无法编译我的代码。我刚刚安装了一个更新版本的 GCC 来解决这个问题,但是我的同事也必须有权访问libgfortran 的共享版本。我认为拥有一个独立的共享库会更容易。你宁愿不这样做吗?有什么选择?也与他们分享libgfortran
    • 与您的同事共享整个 GCC 4.7 编译器套件。向您的系统管理员寻求帮助并讲述这个问题。
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多