【问题标题】:Linking preinstalled libraries from gfortran in Mac OSx 10.6在 Mac OSx 10.6 中从 gfortran 链接预安装的库
【发布时间】:2012-06-27 04:21:55
【问题描述】:

几天来,我一直在尝试编译一段用 fortran90 和 C 编写的代码。我正在使用 gfortran 和 gcc。代码需要链接到 lapack、blas 和 fftw3 库。我的 macbook pro 中安装了所有三个。但是当我运行配置脚本时,由于某种原因,它无法找到 fftw3 库。

这是我的配置行:

./configure --prefix=`pwd` --with-fft=fftw3 \
  --with-fft-lib='-I/opt/local/include -L/opt/local/lib -lfftw3 -lm' \
  --with-blas='-I/opt/local -L/opt/local -lblas' \
  --with-lapack='-I/opt/local -L/opt/local  -llapack' \
  FCFLAGS='-O3 -m64' 

我为 lapack、blas 和 fftw3 使用了完全相同的链接线。配置能够找到 lapack 和 blas 但无法链接 fftw3。有谁知道这里发生了什么?我将不胜感激。

谢谢, 科平约尔

大家好,

首先感谢 Hristo Iliev 之前的回答。我已经能够通过链接库来解决这个问题。您对为库和主代码使用不同的编译器是正确的。这就是问题所在。当我用相同的编译器编译它们时,链接问题就消失了。但现在我有另一个问题。

在代码中有这样一个函数调用:

call io_open(info_files(n_files)%unit,trim(dir)//"/info")

io_open函数定义如下:

subroutine io_open(unit, file, status, form)
    integer,          intent(out) :: unit
    character(len=*), intent(in)  :: file
    character(len=*), intent(in), optional  :: status, form
    integer :: iostat
    character(len=20) :: status_, form_

我得到的错误是这样的:

call io_open(info_files(n_files)%unit, trim(dir)
                                                1
Error: Syntax error in argument list at (1)

基本上似乎代码在

中给出了语法错误
trim(dir)//"/info"

这是函数调用中的文件名。

现在代码在 linux 机器上编译没有任何问题(我使用的是最新版本的 ubuntu)。我只在运行 osx 10.6 的 macbook pro 上收到错误。

同样令人惊讶的是,当我将一个额外的变量 fname 定义为时,代码会编译

fname=trim(dir)//"/info"

然后将其用于函数调用

call io_open(info_files(n_files)%unit,fname)

现在我可以在代码中的所有函数调用中进行替换,这非常多,我可能需要几个小时才能手动进行更改。但不知何故,使用相同编译器的相同代码在 linux 中编译没有错误但在 mac 中失败。有谁知道可能出了什么问题?我将不胜感激。

提前致谢,
科平约尔

【问题讨论】:

  • configure 生成一个日志文件(通常)称为config.log。通过它搜索以查看 configure 究竟是如何尝试测试 FFTW 的可用性以及测试究竟是如何失败的。
  • 您好 Hristo Iliev,感谢您的回复。我查看了 config.log 文件,这是我得到的: configure:6309: checks for dfftw_plan_dft_1d in -lfftw3 configure:6327: gfortran -o conftest -O3 -m64 conftest.f90 -lfftw3 -I/opt/local/include - L/opt/local/lib -lfftw3 -lfftw3f >&5 架构 x86_64 的未定义符号:“dfftw_plan_dft_1d”,引用自:ccmkBOaT.o ld 中的_main:未找到架构 x86_64 collect2 的符号: ld 返回 1 个退出状态。配置:6334:$? = 1 配置:失败的程序是:|主程序 |调用 dfftw_plan_dft_1d |结束
  • 在您尝试构建 64 位版本的代码时,您似乎只有 32 位版本的 FFTW。
  • 感谢您的回答。我刚刚更新了我的问题。代码还有其他事情发生。我想知道你是否有任何想法。
  • 您在 OS X 和 Ubuntu 机器上都有哪些 gfortran 版本?

标签: linker gfortran


【解决方案1】:

感谢 Hristo Iliev 的回复。我刚刚发现了问题。问题是我使用的是同一编译器的不同版本。一旦我用相同版本的编译器更新了环境变量,它就开始工作了。

这就是我所做的,

export FC="gfortran-mp-4.6 -m64"
export F77="gfortran-mp-4.6 -m64"
export F90="gfortran-mp-4.6 -m64"
export CC="gcc-mp-4.6 -m64"
export CXX="g++-mp-4.6 -m64"
export CPP="cpp-mp-4.6 -m64 -C -ansi"
export FCCPP="cpp-mp-4.6 -m64 -C -ansi"
export FCFLAGS="-O3"
export FFLAGS="-O3"

如 APE 邮件列表中所述。

再次感谢,

科平乔尔

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 2011-10-15
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2012-01-19
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多