GFortran 错误:ld:尝试编译时找不到 -lSystem 的库

dat*_*ice 8 macos xcode gcc fortran gfortran

尝试使用 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.
Run Code Online (Sandbox Code Playgroud)

这表明 gfortran 安装正确,我还通过在终端中简单地键入:gfortran 来确认这一点,它返回:

gfortran: fatal error: no input files
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

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

gfortran hello.f90 -o hello.x
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,内容如下:

ld: library not found for -lSystem
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

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

打字:

which gfortran
Run Code Online (Sandbox Code Playgroud)

输出:

/usr/local/bin/gfortran
Run Code Online (Sandbox Code Playgroud)

以及对该目录的长列表搜索:

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
Run Code Online (Sandbox Code Playgroud)

在一切似乎都正确安装的地方,我该如何解决这个问题?

任何帮助将不胜感激!

yeg*_*256 12

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

export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
export LIBRARY_PATH="$LIBRARY_PATH:$SDKROOT/usr/lib"
Run Code Online (Sandbox Code Playgroud)

它有效。


Jac*_*aib 10

在 macOS Big Sur v11.1 上:

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

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

export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
Run Code Online (Sandbox Code Playgroud)

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

  • > “什么是 stdlib” 大约在亚里士多德时代,程序员们心里想“嗯,我们似乎一遍又一遍地编写相同的基本代码,也许我们应该标准化它”。于是 `stdlib` 就诞生了。它包含所有基本构建块,如内存分配、随机数生成器、字符串到 X 的转换、进程和系统控制,甚至一些基本的排序例程。它对于几乎所有现有的程序都是必不可少的。 (2认同)
  • > $LIBRARY_PATH [注意:`$LIBRARY_PATH` 仅适用于 gcc!] 你的计算机是一个装满垃圾的大盒子,但不知何故,为编译器和链接器工作的魔法仙女确切地知道在哪里寻找 `myBoolLib.so`,以便您可以使用“bool invertBoolean(bool in);”。他们怎么知道去哪里寻找?您可以详细地告诉他们每次编译时要查看的位置,但这很“乏味”。因此,您声明本质上是一个系统范围的变量,其中列出了上述精灵在编译时应该查看的一堆位置。 (2认同)

小智 5

我还要补充一下(2020 年 12 月 19 日),我刚刚从 MacOS Mojave 更新到 Catalina,突然收到此错误。

它自行解决了

brew reinstall gcc
brew reinstall gfortran
Run Code Online (Sandbox Code Playgroud)


小智 1

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

brew install gcc

这解决了问题。