运行 mpif90 在 Mac OS X 上出现 ld 错误

ld error when running mpif90 on Mac OS X

我正在尝试编译一个在 OS X (10.11) 上使用 OpenMPI 的 Fortran 程序。我从 Mac HPC. Then I downloaded the Open MPI source version 1.10.1 from the official site 安装 gcc (5.2)、gfortran (5.2) 等开始。然后我构建并安装了 Open MPI(配置、制作、安装),一切似乎都正常工作。我没有收到任何错误,库和二进制文件在我期望的位置。

然后我继续使用 mpif90 编译一个非常简单的 Open MPI fortran 应用程序,那时我从 ld 收到以下链接错误。

Undefined symbols for architecture x86_64:
"_f_", referenced from:
    _MAIN__ in ccm61Nim.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

有没有人见过这个?我怀疑这与我没有使用标准的 Apple 构建链有关,但我不确定。

正在编译的代码:

program main
    use mpi
    double precision    PI25DT
    parameter           (PI25DT = 3.141592653689793238462643d0)
    double precision    mypi, pi, h, sum, x, f, a
    integer             n, myid, numprocs, i, ierr

!   function to integrate f(a) = 4.d0 / (1.d0 + a*a)


    call MPI_INIT(ierr)
    call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
    call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)

    do
        if (myid .eq. 0) then
            print *, 'Enter the number of intervals: (0 quits)'
            read(*,*) n
        endif
!   broadcast n
        call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
!   check for quit signal
        if (n .le. 0) exit
!   calculate the interval size
        h   = 1.0d0 / n
        sum = 0.0d0
        do i = myid + 1, n, numprocs
            x = h * (dble(i) - 0.5d0)
            sum = sum + f(x)
        enddo
        mypi = h * sum

!   collect all the partial sums
        call MPI_REDUCE(mypi, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, ierr)

! node 0 prints the answer

        if (myid .eq. 0) then
            print *, 'pi is ', pi, ' Error is', abs(pi - PI25DT)
        endif
    enddo
    call MPI_FINALIZE(ierr)
end

检查您下载的二进制文件的架构是否与 Mac 匹配。

$ uname -a

Darwin MacBook-Pro.local 15.0.0 Darwin 内核版本 15.0.0:9 月 19 日星期六 15:53:46 PDT 2015; root:xnu-3247.10.11~1/RELEASE_X86_64 x86_64

并且 F90 配置指向正确的 header 文件。应该有配置 步骤安装。在我看来,这就像 F90 得到了错误的 ld 路径,并且正在寻找 headers (*.h) 文件,这些文件不存在或更可能在不同的地方。 Mac 与其他 *NIX 就系统文件的位置不一致。它们可能在 ~/Library 中,而不是在其他系统上预期的位置,例如 /usr/include。请确保您的 F90 确实适用于 Mac OS X 11 而不是某些通用的 *NIX 系统。

您已将变量 f 声明为双精度标量:

double precision    mypi, pi, h, sum, x, f, a

然后你像这样引用 f

sum = sum + f(x)

f 的引用被解释为带有参数 x 的函数。这将编译正常,但您提供的代码未定义函数 f 并且 linking 失败。要解决此问题,您还需要编译 link 包含函数 f 代码的文件。

最简单的解决方法是在代码末尾包含一个函数。在文件末尾的 end program 行之后添加:

!   function to integrate f(a) = 4.d0 / (1.d0 + a*a)
double precision function f(a)
  implicit none
  double precision :: a
  f = 4.d0 / (1.d0 + a*a)
end function f

这提供了 f 的实现,它与您的代码中的注释相匹配,如果包含,您的代码将成功编译。