Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Mac OS X上运行mpif90时发生ld错误_Macos_Fortran_Fortran90_Openmpi - Fatal编程技术网

Macos 在Mac OS X上运行mpif90时发生ld错误

Macos 在Mac OS X上运行mpif90时发生ld错误,macos,fortran,fortran90,openmpi,Macos,Fortran,Fortran90,Openmpi,我正在尝试编译一个在OSX(10.11)上使用OpenMPI的Fortran程序。我从安装gcc(5.2)、gfortran(5.2)等开始。然后我从下载了开源MPI版本1.10.1。然后我构建并安装了openmpi(configure、make、make-install),一切都正常。我没有收到任何错误,库和二进制文件都在我期望的地方 然后,我继续使用mpif90编译一个非常简单的OpenMPIFortran应用程序,这时我从ld收到以下链接错误 Undefined symbols for a

我正在尝试编译一个在OSX(10.11)上使用OpenMPI的Fortran程序。我从安装gcc(5.2)、gfortran(5.2)等开始。然后我从下载了开源MPI版本1.10.1。然后我构建并安装了openmpi(configure、make、make-install),一切都正常。我没有收到任何错误,库和二进制文件都在我期望的地方

然后,我继续使用mpif90编译一个非常简单的OpenMPIFortran应用程序,这时我从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
以前有人见过这个吗?我怀疑这与我没有使用标准的苹果构建链有关,但我不确定

正在编译的代码:

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

达尔文MacBook-Pro.local 15.0.0达尔文内核版本15.0.0:Sat-Sep 19 15:53:46 PDT 2015;根目录:xnu-3247.10.11~1/RELEASE\u X86\u 64 X86\u 64

并且F90配置指向正确的头文件。应该有一个配置
步入舞台。在我看来,F90的ld路径错误,正在查找不存在的标题(*.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
,链接失败。要解决此问题,还需要编译并链接包含函数
f
代码的文件

最简单的修复方法是在代码末尾包含一个函数。在文件最末尾的
结束程序
行后添加以下内容:

!   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
的实现,该实现与代码中的注释相匹配,当包含注释时,代码将成功编译