安装Rcpp时出现链接错误 "找不到-lintl库"

11

当我尝试安装一些以Rcpp为依赖的R包时,我遇到了链接错误。我的环境是Mac OS X 10.9.1(Mavericks),使用Homebrew安装的R 3.0.2。以下是错误输出:

> install.packages('Rcpp')
trying URL 'http://cran.fhcrc.org/src/contrib/Rcpp_0.10.6.tar.gz'
Content type 'application/x-gzip' length 1985569 bytes (1.9 Mb)
opened URL
==================================================
downloaded 1.9 Mb

* installing *source* package ‘Rcpp’ ...
** package ‘Rcpp’ successfully unpacked and MD5 sums checked
** libs
clang++ -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC  -g -O2  -c Date.cpp -o Date.o
clang++ -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC  -g -O2  -c Module.cpp -o Module.o
clang -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC   -c Rcpp_init.c -o Rcpp_init.o
clang++ -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC  -g -O2  -c Timer.cpp -o Timer.o
clang++ -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC  -g -O2  -c api.cpp -o api.o
clang++ -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC  -g -O2  -c attributes.cpp -o attributes.o
clang++ -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC  -g -O2  -c barrier.cpp -o barrier.o
clang++ -I/usr/local/Cellar/r/3.0.2/R.framework/Resources/include -DNDEBUG -I../inst/include/ -I/usr/local/include    -fPIC  -g -O2  -c exceptions.cpp -o exceptions.o
clang++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o Rcpp.so Date.o Module.o Rcpp_init.o Timer.o api.o attributes.o barrier.o exceptions.o -F/usr/local/Cellar/r/3.0.2/R.framework/.. -framework R -lintl -Wl,-framework -Wl,CoreFoundation
ld: library not found for -lintl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
4个回答

21

显然,libintl是gettext软件包的一部分。我进行了以下可能是多余的重新安装,以确保我的副本是最新的:

$ brew install gettext
Warning: gettext-0.18.3.2 already installed
$ brew reinstall gettext
==> Reinstalling gettext 
==> Downloading http://ftpmirror.gnu.org/gettext/gettext-0.18.3.2.tar.gz
Already downloaded: /Library/Caches/Homebrew/gettext-0.18.3.2.tar.gz
==> ./configure --prefix=/usr/local/Cellar/gettext/0.18.3.2 --with-included-gettext --with-included-glib --with-included-libcroco --with-included-libunistring --with-emac
==> make
==> make install
==> Caveats
This formula is keg-only, so it was not symlinked into /usr/local.

OS X provides the BSD gettext library and some software gets confused if both are in the library path.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/gettext/lib
    CPPFLAGS: -I/usr/local/opt/gettext/include

从上面的输出中可以看到,brew没有将库文件建立符号链接,这可能解释了为什么 install.packages 找不到它。解决方法是在~/.R/Makevars中添加一个库路径:

PKG_LIBS=-L/usr/local/Cellar/gettext/0.18.3.2/lib

2
官方说不支持这个。如果你选择这条路,而且出了问题,那么你就得自己承担后果。或许可以尝试一下 r-sig-mac 列表? - Dirk Eddelbuettel
2
重新从 CRAN 安装了二进制文件。安装过程一切顺利。再次感谢。 - cbare
4
我不明白为什么人们要在OSX上从Homebrew安装R。如果我们想要的话,甚至有开发版本的每日二进制构建。如果你使用它,一切都能正常工作。那在Linux上的每日构建在哪里? - Romain Francois
1
使用Homebrew有什么问题吗?您是否也反对用户手动构建R?它应该“只是工作”,完全一样。 - Dominique
6
为什么一些Linux用户想要通过apt-get安装R?同样的原因。 - Chris Fonnesbeck
显示剩余5条评论

5

这篇回答是对Giupo的回答进行修改,因为它包含了一个错别字,但我相信这个问题比评论更重要。这个解决方案是一种非常有效的方法,可以在不引起OSX上更广泛的问题的情况下从Homebrew安装Rserve包:

    flags="CPPFLAGS=-I/usr/local/opt/gettext/lib LDFLAGS=-L/usr/local/opt/gettext/include"
    install.packages('Rserve', configure.args=flags)

为了进一步减少命名空间污染,可以使用 local 进行封装:
    local({
           flags="CPPFLAGS=-I/usr/local/opt/gettext/lib LDFLAGS=-L/usr/local/opt/gettext/include"
           install.packages('Rserve', configure.args=flags)})

2
我尝试编辑之前的问题,但神秘地被拒绝了。 - mcheema
1
如果我拒绝了编辑,那不是我的意图!感谢您指出了这个错别字。 - Giupo

4
我想为这个问题提供一些建议,以较少侵入性的方式添加内容(即:不对用户进行文件/环境更改,以免在将来带来不必要的副作用)。
重新安装gettext并注意LDFLAGS和CPPFLAGS,并将它们与configure.args参数一起传递给R中的install.packages函数。
flags="LDFLAGS=-L/usr/local/opt/gettext/lib CPPFLAGS=-I/usr/local/opt/gettext/include"
install.packages('Rcpp', configure.args=flags)

这应该能解决问题(在我安装Rserve时遇到同样的问题,这个方法对我有用)。


2
希望任何想要使用Homebrew的人都能看到这个解决方案,因为它是有效的,并且副作用很小。 - mcheema
1
我不明白,brew 显示LDFLAGS: -L/usr/local/opt/gettext/lib CPPFLAGS: -I/usr/local/opt/gettext/include但你似乎把它们交换了? - rien333
@rien333,你说得完全正确!抱歉修复晚了! - Giupo

0

这对我很有效:

brew link gettext --force

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