如何使用fPIC

时间:2017-10-20 09:04:43

标签: shared-libraries static-libraries gfortran fpic

我正在从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以及如何确保他们拥有所需的库(例如 {{ 1}}而不是libgfortran.so.3)。

因此,我坚持将所有gfotran库静态链接到我的共享对象中。遗憾的是libgfortran.so.4因错误而失败

gfortran -shared -static-libgfortran -static-libgcc

显然,与gfortran和gcc一起分发的/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 文件尚未使用位置无关代码进行编译。 问题:我需要逐步说明如何使用位置无关代码重建上面列出的gfortran库文件的静态版本,以便我可以成功构建自己的共享库,并将gfortran库静态合并进入他们,减少依赖。

0 个答案:

没有答案