我正在从 Fortran 源代码编译一个共享库(用于 linux 系统),我想将其分发给世界各地的研究人员。我可以用gfortran -shared -o mylib.so ...
. 不幸的是,ldd mylib.so
它揭示了对各种 gfortran 和 gcc 库的依赖,我觉得这完全不能接受:
linux-vdso.so.1 => (0x00007fff995bd000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007fa5227fa000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa5224f1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa5222da000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa521f10000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fa521cd1000)
/lib64/ld-linux-x86-64.so.2 (0x0000561be2268000)
我希望我的程序能够开箱即用地执行,而不需要用户知道如何在他们的机器上安装 gfortran 以及如何确保他们拥有所需的库(例如 libgfortran.so.3
和没有libgfortran.so.4
)。
因此,我坚持将所有 gfotran 库静态链接到我的共享对象中。不幸的是gfortran -shared -static-libgfortran -static-libgcc
失败并出现错误
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/5/libgfortran.a(error.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/5/libgfortran.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
显然,.a
使用 gfortran 和 gcc 分发的文件没有使用与位置无关的代码进行编译。问题:我需要逐步说明如何使用与位置无关的代码重建上面列出的 gfortran 库文件的静态版本,以便我可以成功构建自己的共享库,并将 gfortran 库静态合并到其中,从而减少依赖。