我正在尝试编译一个用Fortran编写的名为DAOSPEC的程序。它给了我以下错误(与其他类似的错误):
/ usr / bin / ld:/home/osboxes/iraf/bin.linux64//libimfort.a(imakwc.o):在创建PIE对象时,不能使用针对`.bss'的重定位R_X86_64_32;用-fPIC重新编译
查看完整的日志here。
我如何解决它?
FCOMP = gfortran
FFLAGS = -Wall -Wextra -fPIC -fmax-errors=1 -O3 -march=native -ffast-math -funroll-loops
.SUFFIXES: .o .f
.f.o:
$(FCOMP) -c $(FFLAGS) $<
default : daospec
daospec: daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o
$(FCOMP) -o daospec daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o -L/usr/local/lib/ -lcfitsio -lplotsub -ldevices -lutils -L/usr/lib/x86_64-linux-gnu/ -lX11 -L/home/YOUR_USERNAME/iraf/bin.linux64/ -limfort -lsys -lvops -L/home/YOUR_USERNAME/iraf/unix/bin.linux64/ -los -lf2c -lcurl
clean:
rm -rf daospec *.o
相同的Makefile可以在不同的PC上使用Ubuntu 16.04 gfortran 5.4,但是在Ubuntu 18.04 gfortran 7.3上打破。在这两种情况下,IRAF库文件都是相同的。
在Vladimir F的帮助下,我设法解决了这个问题。 Ubuntu 18.04使用PIE,位置无关的可执行文件(source),因此它需要使用-fPIC
选项构建库。我使用的official IRAF distribution中的库不是用-fPIC
构建的,这就是造成我错误的原因。
幸运的是,现在可以在Ubuntu 18.04上的iraf-dev
包中安装IRAF库:
sudo apt-get install iraf-dev
或者,可以使用iraf-community/iraf选项从Github的-fPIC
存储库编译IRAF。
最后,我修改了Makefile以使用IRAF库文件的新位置:/usr/lib/iraf/bin/
和/usr/lib/iraf/unix/bin/
。
FCOMP = gfortran
FFLAGS = -Wall -Wextra -fPIC -fmax-errors=1 -O3 -march=native -ffast-math -funroll-loops
.SUFFIXES: .o .f
.f.o:
$(FCOMP) -c $(FFLAGS) $<
default : daospec
daospec: daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o
$(FCOMP) -o daospec daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o -L/usr/local/lib/ -lcfitsio -lplotsub -ldevices -lutils -L/usr/lib/x86_64-linux-gnu/ -lX11 -L/usr/lib/iraf/bin/ -limfort -lsys -lvops -L/usr/lib/iraf/unix/bin/ -los -lf2c -lcurl
clean:
rm -rf daospec *.o