R包magick安装的坑

由于时效问题,该文某些代码、技术可能已经过期,请注意!!!本文最后更新于:2 年前

Magick

安装magick遇到的问题记录一下,毕竟花了好多时间。
问题1:

1
2
3
4
5
6
7
8
9
10
11
12
13
Configuration failed to find the Magick++ library. Try installing:
- deb: libmagick++-dev (Debian, Ubuntu)
- rpm: ImageMagick-c++-devel (Fedora, CentOS, RHEL)
- csw: imagemagick_dev (Solaris)
- brew imagemagick@6 (MacOS)
For Ubuntu versions Trusty (14.04) and Xenial (16.04) use our PPA:
sudo add-apt-repository -y ppa:cran/imagemagick
sudo apt-get update
sudo apt-get install -y libmagick++-dev
If Magick++ is already installed, check that 'pkg-config' is in your
PATH and PKG_CONFIG_PATH contains a Magick++.pc file. If pkg-config
is unavailable you can set INCLUDE_DIR and LIB_DIR manually via:
R CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'

解决方法:按照对应的系统安装 ImageMagick

这个问题好解决,但是事情往往没这么简单。

终极问题:
1
2
3
Error: package or namespace load failed for ‘magick’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/share/apps/R/R-4.2.1/library/00LOCK-magick/00new/magick/libs/magick.so':
/share/apps/R/R-4.2.1/library/00LOCK-magick/00new/magick/libs/magick.so: undefined symbol: _ZN6Magick5Image5writeEPNS_4BlobERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm

就这个问题网上找了好多办法都没解决,也可能是之前自己搜的关键词不对,最开始检索的错误信息(Error: package or namespace load failed for ‘magick’ in dyn.load(file, DLLpath = DLLpath, …)),挖了半天一直试错。最后通过检索(magick.so: undefined symbol: _ZN6Magick5Image5wri)找到了解决方法。

解决方法(如果没有该目录请提前创建):

1
echo "CXX11=/usr/bin/g++" > ~/.R/Makevars

这个方法还是在github上的一个issue上看到的,按方法中所说应该是g++版本的问题,更改编译的g++即可。
地址如下:
https://github.com/ropensci/magick/issues/300

最后的安装命令(下载的源码进行安装的,应该也可以直接安装不用提前下载源码)

1
install.packages("magick_2.7.3.tar.gz",repos=NULL,type="source")
其他错误:usr/bin/ld: cannot find 错误解决方法

通常在软件编译时出现的usr/bin/ld: cannot find -lxxx的错误,主要的原因是库文件并没有导入的ld检索目录中。
其中xxx即表示函式库文件名称,如上例的:libc.so、libltdl.so、libXtst.so。
其命名规则是:lib+库名(即xxx)+.so。
会发生这样的原因有以下三种情形:
1 系统没有安装相对应的lib
2 相对应的lib版本不对
3 lib(.so档)的symbolic link 不正确,没有连结到正确的函式库文件(.so)

解决方式:
1。确认库文件是否存在,比如-l123, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下有无lib123.so, 如果只是存在lib123.so.1,
那么可以通过ln -sv lib123.so.1 lib123.so,建立一个连接重建lib123.so.
2。检查/etc/ld.so.conf中的库文件路径是否正确,如果库文件不是使用系统路径,/usr/lib, /usr/local/lib, 那么必须在文件中加入。
3。ldconfig 重建ld.so.cache文件,ld的库文件检索目录存放文件。尤其刚刚编译安装的软件,必须运行ldconfig,才能将新安装的库文件导入ld.so.cache