Mac OS X中的R错误“ld:warning:directory not found for option”

28

我正试图从源代码安装一个R包,但遇到错误:

* installing *source* package ‘mclust’ ...
** package ‘mclust’ successfully unpacked and MD5 sums checked
** libs
gfortran-4.8   -fPIC  -g -O2  -c mclust.f -o mclust.o
gfortran-4.8   -fPIC  -g -O2  -c mclustaddson.f -o mclustaddson.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o mclust.so mclust.o mclustaddson.o -L/Library/Frameworks/R.framework/Resources/lib -lRlapack -L/Library/Frameworks/R.framework/Resources/lib -lRblas -L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2 -lgfortran -lquadmath -lm -L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2 -lgfortran -lquadmath -lm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
ld: warning: directory not found for option '-L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2'
ld: warning: directory not found for option '-L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2'
ld: library not found for -lquadmath
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mclust.so] Error 1
ERROR: compilation failed for package ‘mclust’
* removing ‘/Library/Frameworks/R.framework/Versions/3.3/Resources/library/mclust’
Warning in install.packages :
  installation of package ‘mclust’ had non-zero exit status

我没有/usr/local/lib/gcc/x86_64-apple-darwin13.0.0,所以它找不到是有道理的。我有/usr/local/lib/gcc/i686-apple-darwin11/usr/local/lib/gcc/4.8(符号链接到Homebrew安装)。它从哪里获取x86_64-apple-darwin13.0.0?

在线上有很多类似错误的参考资料。然而,所有这些参考资料都与在Xcode中编译有关,并通过更新项目设置来解决,这在这里不适用。


"Official R Core" 不支持 Homebrew 安装。在 http://r.research.att.com/ 上有一个 Fortran 包,但我认为它可能与最终出现在 Frameworks 树中的“授权”版本进行了静态链接。我不是这个领域的专家,有一些 SO 的用户(想到 @hrbrmstr)认为 homebrew 是“完全没问题”的。搜索“user:1457051 homebrew”,看看是否有比我更多的支持。 - IRTFM
CRAN使用的当前版本的clang和gfortran可以在此处找到:https://cran.r-project.org/bin/macosx/tools/ - IRTFM
13个回答

31

你需要修改 ~/.R/Makevars 文件。了解更多信息请参阅:https://cran.r-project.org/doc/manuals/r-release/R-admin.html#OS-X-packages

或者,@kevin-ushey 在 这里 更详细地回答了此问题。

出现问题的原因是你的代码没有使用 gcc 运行,而是转发到了 clang

你需要在 ~/.R/Makevars 中更改编译语句,使用 gcc,具体方法如下:

VER=-5.3.0 
CC=gcc$(VER)
CXX=g++$(VER)
CFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
CXXFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
FLIBS=-L/usr/local/Cellar/gcc/5.3.0/lib/gcc/5

假设您已经通过Homebrew安装了gcc

brew install gcc

我已经通过homebrew安装了gcc,并创建了一个Makevars文件,但我一直遇到问题,主要是因为我有一个更新版本的gcc。我将最后一行更改为FLIBS=-L/usr/local/Cellar/gcc/7.3.0_1/lib/gcc/7,然后将第一行更改为VER=-7.3.0_1(这导致出现问题,直到我将其更改为VER=-7)。这可能实际上适用于编译一个R包,但现在由于某种原因默认编译器仍然是clang,我不知道为什么... 有任何想法吗? - Steve S
2
需要设置隐式变量CXX11CXX14CXX17,以使用g++$(VER),就像CXX一样。这些定义了应该用于每个语言标准的编译器。例如,CXX11是C++11标准。 - coatless
非常感谢您的回复,我真的非常感激。现在看来,我能够编译一些软件包而没有问题,但是当其他软件包无法编译时,我最终只好完全注释掉Makevars文件,以便我的系统使用clang,这似乎大部分解决了问题。这种临时应对的方法是否正常 - Steve S
2
为了在今天使用GCC 10.2.0使其工作,我不得不将第二行更改为“CC = gcc”。 - user126350

19

结合之前的解决方案和来自评论区的额外帮助,以下解决方法在我使用的Mac OS X High Sierra上已经成功。

创建/编辑~/.R/Makevars并添加以下内容:

VER=-8
CC=gcc$(VER)
CXX=g++$(VER)
CXX11=g++$(VER)
CXX14=g++$(VER)
CXX17=g++$(VER)
CFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
CXXFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
FLIBS=-L/usr/local/Cellar/gcc/8.2.0/lib/gcc/8

注意,我正在使用Homebrew,并安装了gcc版本8.2.0。


FLIBS的负责人在类似情况下工作过,当时编译器找不到gfortran的库。 - Clayton Stanley
只是为了其他遇到同样问题的人,这种方法在我的MacOS Big Sur上也起作用了。 - A_Murphy
唉,对于我在M1上使用Big Sur来说,它不起作用。与其他答案的评论一样,首先将第二行更改为CC = gcc并使用/opt/homebrew。但是会抛出“检查g ++ -10是否接受-g...否则configure:错误:未找到C ++编译器或无法创建可执行文件”。 - tiptoebull

9

我在Mac上工作时有这个问题已经很长时间了。遵循本页面和其他问题的其他答案,我做了以下步骤,最终问题得以解决!

第一步 - brew install gcc(安装gcc-11.如果您将来使用的版本不同,请替换下面的gcc-11,并检查文件夹/usr/local/bin中的最新gcc版本文件)

第二步 - xcode-select --install (这将安装Xcode CLI)

第三步 - ln -sf /usr/local/bin/gcc-11 /usr/local/bin/gcc (这将在/ usr / local / bin /下创建一个新的gcc符号链接。来源

第四步 - 我没有~/.R/Makevars文件。实际上我连~./R文件夹都没有。因此我新建了一个文件夹和一个文件。下面是我在Makevars文件中编写的内容(请根据您拥有的版本更改第一行和最后一行中的GCC版本。还要记得在第一行中只包含总版本号而不是完整版本号。在我的情况下是11):

VER=-11
CC=gcc$(VER)
CXX=g++$(VER)
CXX11=g++$(VER)
CXX14=g++$(VER)
CXX17=g++$(VER)
CFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
CXXFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
FLIBS=-L/usr/local/Cellar/gcc/11.2.0_3/lib/gcc/11

现在重新启动,完美!它能够正常工作。


1
刚刚解决了我的gfortran问题。 - rbasa
1
这对我来说有效(2023年9月19日),在Mac OS Ventura 13.5.2上。R版本为4.2.3。请确保将版本号VER和FLIBS路径更改为您的最新版本。谢谢,@user1993! - undefined
由于大多数答案都是过时的,那么我该如何确定版本值呢? - undefined
1
@jzadra 我在第一步中提到 - 检查垃圾箱。 - undefined

9

4
当我输入第二行时,出现了 "tar: Unrecognized archive format" 的错误提示。我做错了什么? - Obromios

6
我正在使用 MacOS Mojave(10.14.5)和 R 4.0.0。问题在于“CRAN R 4.0.0 builds and higher no longer use any custom compilers”(请参见这里),因此,Makevars解决方案似乎不再起作用。
对我来说,解决方案是从 官方 R-Project 网站下载并安装 GNU Fortran 编译器。请注意,您还需要 Xcode 和 Xcode 命令行工具。
在使用默认设置运行安装程序后,gfortran 代码的编译工作正常进行。

4
在我的情况下,我将这个答案这个答案相结合,以生成以下代码于~./R/.Makevars文件中。
touch ~./R/.Makevars

(因为它在那里不存在)

open -a BBEdit ~./R/.Makevars

(我使用BBEdit作为文本编辑器)

将以下行添加到Makevars文件中:

VER=-11
CC=gcc$(VER)
CXX=g++$(VER)
CFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
CXXFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
# FLIBS=-L/usr/local/Cellar/gcc/11.1.0_1/lib/gcc/11
# FLIBS = -L`gfortran -print-file-name=libgfortran.dylib | xargs dirname`
FLIBS=`gfortran -print-search-dirs | grep ^libraries: | sed 's|libraries: =||' | sed 's|:| -L|g' | sed 's|^|-L|'`

这两行代码是由@KevinUshy提供的建议。

# FLIBS=-L/usr/local/Cellar/gcc/11.1.0_1/lib/gcc/11
# FLIBS = -L`gfortran -print-file-name=libgfortran.dylib | xargs dirname`

我把这些注释掉了,因为我认为最后一行可能会起到最好的作用。

两个注意点。

我已经安装了brew,并使用命令brew install gcc安装了gcc

我使用brew info gcc来确定版本名称,它给出了11.1.0_1,但是它链接为gcc-11,所以.Makevars文件中设置VER=-11

希望这对其他人有所帮助。


我也在使用版本11,但不知何故我的GCC链接为“gcc”,因此我删除了“VER=-11”并且它工作正常。 - Duccio A

4

我在 MAC 上遇到了同样的错误。我只需要从https://cran.r-project.org/bin/macosx/tools/安装 gfortran-6.1.pkg 即可。确保该软件包已安装在 /usr/local/gfortran 下,以便 R 找到它。

或者您可以通过终端输入brew cask install gfortran来使用 homebrew 安装(它可能会要求您输入密码)。


3
对于 R 4.3.0 及更高版本,您可以通过访问 https://mac.r-project.org/tools/ 并安装 gfortran-12.2 universal 来解决此问题:

R 4.3.0 及更高版本使用通用的 GNU Fortran 12.2 编译器。您可以下载一个安装程序包 gfortran-12.2-universal.pkg(242MB)- 有关更多详细信息和其他下载选项,请参阅 GitHub 上的 R-macos GNU Fortran 发布。


只等了7年才等到这一刻。 - burger

2

我使用的是Mac OS Catalina,安装Homebrew、最新版本的gcc和Gfortran 8.2.0解决了这个问题。


这在我的Mac OS Catalina上也适用!我使用了gfortran 8.2 Mojave安装版本https://github.com/fxcoudert/gfortran-for-macOS/releases。 - Danny
在Mojave上,执行brew update && brew reinstall r,然后执行brew link --overwrite r即可。 - Obromios

1
解决方案是使用Homebrew重新安装有问题的软件包。
$ brew uninstall --ignore-dependencies --force openssl
$ brew install openssl

$ brew uninstall --ignore-dependencies --force readline  
$ brew install readline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接