我正在尝试编译库AGMG。
并行示例的 make 文件如下所示:
# MPIopt = -I/... (where to find mpif.h)
# MUMPSPopt = -I/... (where to find files to be included by
# applications using MUMPS)
# MUMPSlib = -l... (link reference for MUMPS)
# SCALAP = -l... (link reference for SCALAPACK, needed by MUMPS)
# BLASLAPACK= -l... (link reference for LAPACK & BLAS)
# MPIlib = -l... (link reference for MPI)
在我的 Debian 上找到 mpif.h:
$ ls /usr/lib/openmpi/include/mpi.h
/usr/lib/openmpi/include/mpi.h
所以我在Makefile中写道:
MPIopt = -I/usr/lib/openmpi/include/
MPIlib = -lmpi
但无论如何,当我尝试编译时,我收到以下错误:
:~/AGMG_3.0/Example_par$ make
cd ../SRC;make dpar
make[1]: Entering directory `AGMG_3.0/SRC'
make[1]: Nothing to be done for `dpar'.
make[1]: Leaving directory `AGMG_3.0/SRC'
gfortran-4.4 -O4 -o Example_par Example_par.o ../SRC/dagmg_par.o -lmpi
Example_par.o: In function `MAIN__':
Example_par.f90:(.text+0x77): undefined reference to `mpi_init_'
....
....
....
dagmg_par.f90:(.text+0x19fc9): undefined reference to `mpi_comm_rank_'
dagmg_par.f90:(.text+0x19fdd): undefined reference to `mpi_comm_size_'
collect2: ld returned 1 exit status
make: *** [Example_par] Error 1
我现在很困惑,我尝试过成功,但我遇到了 scaplap 的问题 以及其他要求。 发现头皮:
$ dpkg -L libscalapack-mpi-dev
/.
/usr
/usr/lib
/usr/lib/libscalapack-openmpi.a
mumps 位于 /usr/lib/libsmumps.a 中,头文件位于 /usr/include/smumps_c.h 中
那么我该如何将所有这些组合在一起呢?
我知道对于更高级的 Fortran 或 C 开发人员来说,这将是微不足道的......
预先感谢您的帮助。
编辑: 我在这里放置了完整的 Makefile 定义,希望对其他人有帮助:
MPIopt = -I/usr/lib/openmpi/include -I/usr/lib/openmpi/lib -L/usr/lib/openmpi/lib -pthread
MPIlib = -lmpi_f90 -lmpi_f77 -lmpi
MUMPSPopt = -I/usr/lib/libsmumps.a -I/usr/lib/libdmumps.a
MUMPSlib = -lsmumps -ldmumps
BLASLAPACK=-L/usr/lib -llapack -lblas
BLASLAPACK=-L/usr/lib -llapack -lblas
SCALAP = -L/usr/lib/libscalapack-openmpi.a -lscalapack-openmpi
F90=gfortran-4.6
这样就构建好了。谢谢各位的回复!
我认为您缺少 fortran MPI 库的东西。您应该使用安装的 mpi 编译器包装器,通常称为 mpif90。如果您想手动指定所有库,您可以使用
查看包装器设置的选项mpif90 --showme
(对于 openmpi)或一些类似的标志,具体取决于您的 MPI 库。
这些是链接器错误。 看起来您的包含文件已成功获取,但链接器没有看到 MPI 库。 尝试将
MPIlib = -lmpi
更改为包含 libmpi.a
路径的内容,例如 MPIlib = -L/usr/lib/openmpi/lib -lmpi
或者,尝试使用 MPI 编译器包装器,如 @haraldkl 所建议。 这些应该负责自动链接到 MPI。