【问题标题】:Compile a library that uses mpi (AGMG)编译一个使用 mpi (AGMG) 的库
【发布时间】:2012-03-23 08:14:52
【问题描述】:

我正在尝试编译库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    

这构建了它。感谢您的回复!

【问题讨论】:

    标签: compiler-construction fortran mpi openmpi


    【解决方案1】:

    我认为您缺少 fortran MPI 库的内容。您应该使用安装的 mpi 编译器包装器,通常称为 mpif90。如果你想手动指定所有的库,你可以看看包装器设置的选项

    mpif90 --showme
    

    (对于 openmpi)或一些类似的标志,取决于您的 MPI 库。

    【讨论】:

    • 感谢您的回答。虽然这向我展示了有关 MPI 的内容,但我仍然与其他库进行了很多斗争。另一个答案向我展示了如何为其他人做这件事,所以我接受了。
    【解决方案2】:

    这些是链接器错误。看起来您的包含文件已被成功提取,但链接器没有看到 MPI 库。尝试将MPIlib = -lmpi 更改为包含libmpi.a 路径的内容,例如MPIlib = -L/usr/lib/openmpi/lib -lmpi

    或者,按照@haraldkl 的建议,尝试使用 MPI 编译器包装器。这些应该负责自动链接到 MPI。

    【讨论】:

    • 谢谢!这向我展示了如何做到这一点! -L/Path/to/Library.a -llibName!
    猜你喜欢
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多