【问题标题】:GFortran error: ld: library not found for -lSystem when trying to compileGFortran错误:ld:尝试编译时找不到-lSystem的库
【发布时间】:2019-10-03 00:31:00
【问题描述】:

我在尝试使用 gfortran 编译一个简单的 fortran-90 文件时遇到一个奇怪的错误。我正在开发 macOS mojave 系统。我已经安装了 gfortran 8.2.0,并通过执行以下操作来确保这一点:

Input: gfortran --version
Output: GNU Fortran (GCC) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE.

这表明 gfortran 安装正确,我还通过在终端中简单地输入:gfortran,然后返回:

gfortran: fatal error: no input files
compilation terminated.

但是,当我尝试像这样编译我的文件时:

gfortran hello.f90 -o hello.x

我收到一条错误消息:

ld: library not found for -lSystem
collect2: error: ld returned 1 exit status

我尝试过以不同的方式进行编译,还尝试按照https://gcc.gnu.org/wiki/GFortranBinaries32Linux 的描述在 .bash_profile 中设置 LD_LIBRARY_PATH,但我仍然遇到同样的错误。 gfortran 目录的路径名是:/usr/local/gfortran,但是在 /usr/local/bin 中可以找到另一个不是目录的 gfortran

打字:

which gfortran

输出:

/usr/local/bin/gfortran

并对该目录进行长列表搜索:

Input: ls -l /usr/local/bin/gfortran
Output: lrwxr-xr-x  1 root  wheel  32 15 May 14:07 
/usr/local/bin/gfortran -> /usr/local/gfortran/bin/gfortran

如果一切似乎都已正确安装,我该如何解决这个问题?

任何帮助将不胜感激!

【问题讨论】:

  • 你安装了xcode命令行工具吗?根据 gfortran 二进制文件,可能需要这些文件才能正常工作。您可能还想使用例如自制程序构建,这些都是最新的。
  • @janneb 我确实为 xcode 安装了命令行工具,我在另一个苹果设置上尝试了自制程序构建,但出现了同样的问题,但我可以在这台计算机上尝试
  • 命令行工具已过时。解决方案:sudo rm -rf /Library/Developer/CommandLineTools,然后是xcode-select --installsudo xcode-select --switch /Library/Developer/CommandLineTools,如果 Xcode 太过时,更新 Xcode。毕竟,如果你安装了 Xcode,你可能想sudo xcode-select -s /Applications/Xcode.app

标签: xcode macos gcc fortran gfortran


【解决方案1】:

在 macOS Big Sur v11.1 上:

相关 SO 帖子:https://apple.stackexchange.com/questions/408999/gfortran-compiler-error-on-mac-os-big-sur

解决方法是将标准库添加到您的$LIBRARY_PATH。出于某种原因,它在 11.1 上不再符合您的标准 $PATH

export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"

(或将其添加到登录文件并重新启动终端)。

【讨论】:

  • 你能ELI5吗?什么是标准库和 $LIBRARY_PATH?特别是,我在哪里运行您共享的代码 sn-p?谢谢!
  • > "什么是标准库" 大约在亚里士多德时代,程序员自认为“嗯,我们似乎一遍又一遍地编写相同的基本代码,也许我们应该对其进行标准化”。于是stdlib诞生了。它包含所有基本的构建块,如内存分配、随机数生成器、字符串到 X 的转换、进程和系统控制,甚至一些基本的排序例程。它对于几乎所有现有程序都是必不可少的。
  • > $LIBRARY_PATH [注意:$LIBRARY_PATH 仅适用于 gcc!] 您的计算机是一大箱垃圾,但不知何故,为编译器和链接器工作的魔法精灵确切地知道在哪里寻找myBoolLib.so 以便您可以使用 bool invertBoolean(bool in);。他们怎么知道去哪里看?每次编译时,您都可以详细地告诉他们要查看的确切位置,但这很乏味。所以你声明什么本质上是一个系统范围的变量,它列出了前面提到的精灵在编译时应该看的一堆地方。
  • > "我在哪里运行您共享的代码 sn-p?"从命令行,但请注意,您每次都必须这样做。或者,您可以将其放入您的“登录文件”中,假设您使用 bash 是~/.bash_profile 和/或~/.bashrc。每次打开新终端时都会运行这些文件,并用作一种“自定义”文件。如果您将上面的代码粘贴到其中一个,它会在您创建新的终端实例时自动执行。
  • 在我的 Big Sur 系统上,它实际上处于稍微不同的路径:export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/usr/lib"
【解决方案2】:

我也将插话(2020 年 12 月 19 日),我刚刚从 MacOS Mojave 更新到 Catalina,突然收到此错误。

它自己解决了

brew reinstall gcc
brew reinstall gfortran

【讨论】:

    【解决方案3】:

    我将此添加到我的~/.profile

    export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
    export LIBRARY_PATH="$SDKROOT/usr/lib"
    

    它有效。

    【讨论】:

    • 可能值得把export LIBRARY_PATH="$LIBRARY_PATH:$SDKROOT/usr/lib"
    【解决方案4】:

    更新:我尝试了建议并使用自制软件从 gcc 包安装了 gfortran 版本,这给了我一个更新版本的 gfortran,我的问题得到了解决!

    【讨论】:

      【解决方案5】:

      对于那些使用 MacPorts 的人。

      # Installed `gcc8` and `gcc_select`
      sudo port install gcc_select gcc8
      
      # then to create "gfortran" softlink to "gfortran-mp-8"
      sudo port select --set gcc gcc8
      
      # and added to my .profile
      export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
      

      我做了ls -l /Library/Developer/CommandLineTools/SDKs/,发现 Xcode 安装了一个用于 Catalina 的 SDK 和一个用于 Big Sur 的 SDK。我将MacOSX.sdk 的软链接更改为指向Catalina 版本。

      【讨论】:

        【解决方案6】:

        只是将这一行放在.zshrc的末尾:

        export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
        

        然后再次运行我的 Fortran 代码进行编译——成功! -lSystem 的问题已在我的 macOS 系统中解决。

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题,但是使用自制软件从 gcc 包安装 gfortran 构建并没有帮助。相反,我使用自制软件安装了整个 gcc:

          brew install gcc

          这样就解决了问题。

          【讨论】:

          • 这不是解决办法。 (确保它为您提供了一个有效的 gfortran 但没有回答问题)
          【解决方案8】:

          我最近有这个

          ld: library not found for -lSystem
          

          将 Mac OS 从 v10 升级到 v11 (Big Sur) 后出现问题。我正在使用Xcode 12.3,我使用brew install gcc 安装gfortran 10.2.0。尝试brew reinstall gcc 后我仍然看到错误。我能够使用以下方法解决问题:

          brew install gfortran
          

          但我不知道为什么会这样。

          【讨论】:

          • 我遇到了同样的问题。但是,当我运行brew reinstall gfortran 时,它只是重新安装gcc 10.2.0,所以问题(ld: library not found for -lSystem)仍然存在。有什么建议吗?
          【解决方案9】:

          我遇到了这个问题,我尝试了很多方法来解决这个问题,但只有使用这两个“两个”命令才能解决它:

          brew reinstall gcc
          brew reinstall gfortran
          

          【讨论】:

            猜你喜欢
            • 2012-03-20
            • 2014-03-05
            • 1970-01-01
            • 1970-01-01
            • 2014-08-18
            • 2019-03-13
            • 2021-07-26
            • 2014-08-17
            相关资源
            最近更新 更多