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

时间:2015-11-08 22:14:31

标签: macos fortran fortran90 openmpi

我正在尝试编译在OS X上使用OpenMPI的Fortran程序(10.11)。我开始从Mac HPC安装gcc(5.2),gfortran(5.2)等。然后我从the official site下载了Open MPI源版本1.10.1。然后我构建并安装了Open MPI(configure,make,make install),一切似乎都有效。我没有收到任何错误,库和二进制文件是我期望的。

然后我继续使用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

2 个答案:

答案 0 :(得分:3)

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

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

然后你像这样引用f

sum = sum + f(x)

f的引用被解释为带参数x的函数。这将编译正常,但您呈现的代码不定义函数f,并且链接失败。要解决此问题,您还需要编译并链接包含函数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的实现,它与代码中的注释相匹配,并且在包含时代码将成功编译。

答案 1 :(得分:-1)

检查您下载的二进制文件的架构是否与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配置指向正确的头文件。应该有一个配置 安装步骤。这对我来说就像F90得到了错误的ld路径,并且正在寻找那些不存在或者更多可能位于不同位置的标题(* .h)文件。对于系统文件的位置,Mac与其他* NIX不一致。它们可能位于〜/ Library中,而不是在/ usr / include等其他系统上预期的位置。确保您的F90真的适用于Mac OS X 11,而不适用于某些通用的* NIX系统。