在使用Xcode 5.0和Rcpp时出现错误(命令行工具已安装)

15

我有一台新的iMac,正在尝试使用Rcpp库运行代码,但是这个库在我的旧iMac和Macbook Pro上都能够正常工作。我已经尝试了一切,但似乎无法找出问题所在。

我下载了Xcode 5.0并安装了命令行工具。我已经安装了R3.0.2。我还下载了一个gcc编译器。当我在终端中输入gcc时,我得到的是"clang:",我认为这很好。

下面是我收到的错误信息。非常感谢您提供任何想法和建议。

Error (in R console):
llvm-g++-4.2 -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG  -I/usr/local/include  -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include"    -fPIC  -mtune=core2 -g -O2  -c SBM-Ccode.cpp -o SBM-Ccode.o 
Error in sourceCpp("SBM-Ccode.cpp") : 
  Error 1 occurred building shared library.

WARNING: The tools required to build C++ code for R were not found.

Please install Command Line Tools for XCode (or equivalent).

/bin/sh: llvm-g++-4.2: command not found
make: *** [SBM-Ccode.o] Error 127

1
你使用的是哪个版本的Mac OS / XCode,现在又使用了哪些版本? - Paul Hiemstra
你输入 gcc 却得到了 clang?这并不太合理;gccclang 是用于编译的不同工具链。XCode 自带一个(虽然有点老但是兼容的)版本的 gcc 用于编译;你从哪里获取了新版本的 gcc?你能否从命令行运行 llvm-g++-4.2(这应该是 XCode 版本的 g++)? - Kevin Ushey
Kevin:我认为 R 在其构建中记住了 g++-4.2.1。OP 表示他通过 XCode 5.0 将 clang 添加到了系统中。现在的问题是如何告诉 R 使用 clang;请参见我的答案和 Romain 的早期答案。 - Dirk Eddelbuettel
我在Dirk提到的Makeconf文件中有CXX = llvm-g++-4.2 -arch x86_64。这是直接从CRAN二进制安装的R。没有什么花哨的东西。 - Romain Francois
但显然必须覆盖它才能使R开箱即用。我为自己的断言得分,即OS X并不像其粉丝所说的那样容易。人们从哪里获取其Fortran编译器和库(某些CRAN软件包所需)?Homebrew? - Dirk Eddelbuettel
显示剩余11条评论
3个回答

18

我不确定你所说的“我下载了gcc编译器”的意思。你不需要下载自己的gcc。你可以使用默认的gcc或者通过在~/.R/Makevars文件中添加以下内容来使用clang++:

CC=clang
CXX=clang++
CXXFLAGS= -O3 -pedantic

当您尝试使用 devtools::has_devel 时会发生什么:

> require(devtools)
> has_devel()
'/Library/Frameworks/R.framework/Resources/bin/R' --vanilla CMD SHLIB foo.c

clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG  -I/usr/local/include    -fPIC  -mtune=core2 -g -O2  -c foo.c -o foo.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -L/usr/local/lib -o foo.so foo.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
[1] TRUE

或者Rcpp::evalCpp

> require(Rcpp)
> evalCpp( "1+1")
[1] 2    

当我运行第一个命令时,会收到以下错误提示:'/Library/Frameworks/R.framework/Resources/bin/R' --vanilla CMD SHLIB foo.c llvm-gcc-4.2 -arch x86_64 -std=gnu99 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -fPIC -mtune=core2 -g -O2 -c foo.c -o foo.o make: llvm-gcc-4.2: 没有这个文件或目录 make: *** [foo.o] 错误 1 错误:命令执行失败(1) - user2904609
当我执行第二个时,我得到了与我的OP中相同的错误。 llvm-g++-4.2 -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include" -fPIC -mtune=core2 -g -O2 -c file1818236400cd.cpp -o file1818236400cd.o - user2904609
在 sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput, ) 中出现错误:构建共享库时发生错误1。警告:找不到用于为R构建C++代码所需的工具。 请安装XCode的命令行工具(或等效工具)。/bin/sh: llvm-g++-4.2: 命令未找到 make: *** [file1818236400cd.o] Error 127 - user2904609
1
你重启了R会话吗?这对你应该有效;仍在搜索llvm-g++-4.2的事实很奇怪。事实上,clang现在是XCode 5.0中唯一的编译器,因此不再提供llvm-g++-4.2。这解释了OP中出现的有些奇怪的错误。 - Kevin Ushey
1
谢谢大家!我重新启动了,现在一切正常。非常感谢你们的帮助。 - user2904609

8

快速猜测:

  1. 您正在运行由Simon构建/CRAN提供的预编译R二进制文件。

  2. R将其配置选项存储在其编译时,这些选项会影响其运行时。

  3. 通过文件$R_HOME/etc/Makeconf检查并查看CC和CXX。

  4. 如Romain所建议的那样,通过文件~/.R/Makevars覆盖CCCXX

  5. 再试一次。

编辑:我刚刚与一位同事确认了一个完全相同的问题,他在Mac OS X上升级到XCode 5 - 现在需要覆盖CCCXX,因为R是使用之前版本的XCode构建的。


对于3,您还可以使用R CMD config CXX - Romain Francois

5
一种更简单的解决方案如下: 您应该创建 llvm 编译器的软链接,在终端中输入以下命令:
cd /usr/bin
sudo ln -fs clang llvm-gcc-4.2
sudo ln -fs clang++ llvm-g++-4.2

注意:在Matlab中,这也适用于mex。

对我来说很有效,而且比编辑“Makeconf”文件要少一点可怕。 - ricardo
一个类似的解决方案对我也起作用了: sudo ln -fs clang gcc-4.2; sudo ln -fs clang++ g++-4.2 - Mark Graph

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