我正在使用Ubuntu 10.04,并试图编译一些使用gfortran的代码。 在某些时候,Makefiles会这样做:
-L. -lgfortran
我得到的错误
/usr/bin/ld: cannot find -lgfortran
虽然安装了:
ldconfig -p | grep fortran libgfortran.so.3 (libc6,x86-64) => /usr/lib/libgfortran.so.3
我该如何解决?
PS:Makefile:
## FLAGS CC:= gcc C++:= g++ CFLAGS:= -c -O -Dintel -g FC:= gfortran FFLAGS:= -c -O -cpp -g LD:= g++ LDFLAGS:= -O WETTER_CGAL_FLAGS:= -g #WETTER-Data WETTER_cgal: weather.cpp surface_alg.h $(WETTER_CGAL_OBJECTS) WATT_interface.h data.cpp $(C++) $(WETTER_CGAL_FLAGS) -c weather.cpp -frounding-math $(C++) -c data.cpp -frounding-math $(LD) $(WETTER_CGAL_OBJECTS) weather.o data.o -o WETTER_cgal -L. -lgfortran -lgmp -lCGAL -frounding-math -fp-model
你的gfortran
版本有什么不同于你的g++
的版本? 或者,也许它安装在不同的位置?
-lname
选项(在这种情况下, name
为gfortran
)指示链接程序在库搜索路径中搜索名为libname.a
的库文件。 如果找到并且静态链接没有被-[B]static
选项强制执行,则链接器将再次搜索libname.so
并libname.so
链接(如果找到)。 如果没有找到libname.a
即使存在libname.so
也会发生错误。
在你的gfortran
安装中应该有一个libgfortran.a
地方。 用find
它,并用-L/path/to/compiler/libs
提供g++
-L/path/to/compiler/libs
。 如果g++
与gfortran
版本相同,则libgfortran.a
的路径已经存在于库搜索路径中(因为C / C ++和Fortran静态库都驻留在同一位置)。 如果两个编译器的版本不同,它将不会出现。
例如,在基于64位RedHat的系统上, libgfortran.a
位于/usr/lib/gcc/x86_64-redhat-linux/<GCC version>/
而共享libgfortran.so.*
位于/usr/lib64
。
另一种解决方案是用/usr/lib/libgfortran.so.3
替换-lgfortran
。
-L.
选项与-lCGAL
不是-lgfortran
。
我今天在编译ATLAS时遇到了同样的问题,并且能够使用从libgfortran.so.3
到libgfortran.so
的符号链接来修复它。
只要确保你:
gcc --version
和
gfortan --version
是一样的。
/usr/bin/
包含不同的版本。
例如:如果gcc--version returns 4.7.3
和gfortran --version 4.8
gcc--version returns 4.7.3
gfortran --version 4.8
,简单的黑客可以做以下事情。
sudo cp /usr/bin/gcc-4.8 /usr/bin/gcc
它应该工作。
我有同样的问题,并尝试以下命令。 问题解决了这个问题:
sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 /usr/lib/libgfortran.so