未定义符号mpi\u fortran\u错误代码\u忽略__
我正试图在Ubuntu 14.04上编译一个Fortran程序(vasp) 我在较旧的系统(13.10)上获得了成功,但在重新安装我的机器后,出现了符号查找错误: /usr/lib/libmpi_f77.so.1:未定义符号:mpi_fortran\u errcodes\u ignore__ 奇怪的是,这个符号似乎就在那里: readelf-W-s/usr/lib/libmpi_f77.so.1 | grep“errcodes_ignore” 16:0000000000000000对象全局默认值和mpi\u fortran\u错误代码\u忽略__ 142:0000000000000000对象全局默认值和mpi\u fortran\u错误代码\u忽略 244:0000000000000000对象全局默认值和mpi\u fortran\u错误代码\u忽略_ 我怀疑这可能是因为该符号仅位于库的静态部分,因为当我运行时 readelf-W-s-D/usr/lib/libmpi_f77.so.1 | grep“errcodes_ignore” 我没有得到任何结果,但对于这是否真的是问题以及如何解决问题,我有点不知所措 任何帮助都将不胜感激 谢谢未定义符号mpi\u fortran\u错误代码\u忽略__,fortran,mpi,static-linking,gfortran,Fortran,Mpi,Static Linking,Gfortran,我正试图在Ubuntu 14.04上编译一个Fortran程序(vasp) 我在较旧的系统(13.10)上获得了成功,但在重新安装我的机器后,出现了符号查找错误: /usr/lib/libmpi_f77.so.1:未定义符号:mpi_fortran\u errcodes\u ignore__ 奇怪的是,这个符号似乎就在那里: readelf-W-s/usr/lib/libmpi_f77.so.1 | grep“errcodes_ignore” 16:0000000000000000对象全局默认值
马丁。我通过这个问题解决了这个问题:
我的LD_LIBRARY_路径包含指向不同版本MPI的路径(用于我正在使用的另一个软件)。运行程序前更改路径解决了问题。在我的系统上,该符号位于libmpi.so(OpenMPI 1.10)中。尝试将-lmpi添加到链接选项中,看看符号是否解析。谢谢,但似乎没有帮助。ELF DSO中没有静态部分。动态符号表(也称为
.dynsym
a.k.a.全局符号表)仅重复普通符号表中的全局符号子集mpi\u fortran\u errcode\u ignore*
不是由libmpi\u f77.so.1
提供的,而是从另一个带有开放mpi的DSO导入的,这从其UND
定义的状态可以看出。为什么这些不在全球符号表中对我来说是一个完全的谜。在任何情况下,您都必须链接到libmpi.so.1
。请确保它没有被其他MPI版本/实现覆盖。感谢您的帮助和解释。(实际上不知道如何解释readelf输出)到目前为止。我没有成功链接到libmpi(在Makefile中的所有链接器选项语句中添加了-lmpi,但到目前为止没有成功)。我在链接器中添加了一个-t选项,并用灰色标记为“mpi”。我得到-lmpi(/usr/lib/openmpi/lib//libmpi.so)-lmpi_f90(/usr/lib/openmpi/lib//libmpi_f90.so)-lmpi_f77(/usr/lib/openmpi/lib//libmpi_f77.so),所以我认为它应该链接到libmpi。令人费解。