太長不看版
- magick的安裝需要底層的imagemagick支持
- Ubuntu16.04由于版本老舊熔酷,安裝的舊版imagemagick無法使用
- 使用spack自己安裝新版,可以解決編譯問題染突。
果子老師向我求助唁情,讓我?guī)兔Π惭b一個R包, magick啊终。這個R包镜豹,我在自己的CentOS系統(tǒng)的服務(wù)器上安裝過,在我的Mac上裝過蓝牲,我覺得應(yīng)該不是個大問題趟脂。
然而,從最后我所花的時間來看例衍,這確實是個大問題昔期,因為這是果子老師提出的問題,但凡是他提出的問題肄渗,他肯定是前期花了點時間的镇眷,也就是常規(guī)的路子都走過了,實在沒法子才來找我出手翎嫡。
這個信息的報錯消息如下
magick.so: undefined symbol: _ZNK6Magick8GeometrycvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEv
我通過檢索欠动,發(fā)現(xiàn)有人通過設(shè)置~/.R/Makevars
里的C++配置解決過
CXX11=/usr/bin/g++
但是,我測試過了這個方法,并不可行具伍。不過翅雏,在這個思路下,我有兩個猜測
- R語言版本或許要最新版4.2.2人芽,這是最簡單的思路望几。很大一部分問題都可以通過升級R來解決。
- GCC版本低萤厅,無法提供magick所要求的庫橄抹。
對于第一個猜想,我編譯了最新R4.2.2, 但是發(fā)現(xiàn)并不是原因惕味。
對于第二個猜想楼誓,我得編譯一個gcc,這個我在2018年的【無root權(quán)限下解決編譯時的依賴問題】中介紹過名挥,但是那個操作太復(fù)雜了疟羹,現(xiàn)如今可以考慮用spack(https://spack.io/)。
# 關(guān)于spack的安裝和使用禀倔,不在此文介紹
spack install gcc
spack load gcc
但是榄融,基于最新的GCC去編譯R包依舊不行,甚至救湖,基于最新的GCC編譯的最新的R也不行愧杯。此時,我的心態(tài)有點暴躁捎谨,于是民效,我想著要不要就不在這臺服務(wù)器上編譯了憔维,用另一臺Ubuntu服務(wù)器編譯好涛救,復(fù)制過來不就好了嗎?
但是业扒,由于兩臺機子的Ubuntu版本不同检吆,結(jié)果有依賴庫的問題
錯誤: package or namespace load failed for ‘magick’ in dyn.load(file, DLLpath = DLLpath, ...):
無法載入共享目標對象‘/home/xzg/R/x86_64-pc-linux-gnu-library/4.2/magick/libs/magick.so’::
libMagick++-6.Q16.so.8: cannot open shared object file: No such file or directory
這個情況,有一種偷懶的方式程储,就是用ln 做了軟連接
ln -s /usr/lib/x86_64-linux-gnu/libMagick++-6.Q16.so /usr/lib/x86_64-linux-gnu/libMagick++-6.Q16.so.8
然而蹭沛,依舊報錯(好消息不是之前的錯誤)
/home/xzg/R/x86_64-pc-linux-gnu-library/4.2/magick/libs/magick.so:
undefined symbol: _ZN6Magick5Image10fontWeightEm
盡管失敗了,但是我有了一個新的猜想章鲤, 那就是系統(tǒng)自帶的Magick的版本低了摊灭。有沒有一種可能,在R里败徊,我安裝舊版本的magick就可以避免這個問題呢帚呼?于是,我找到了它的歷史存檔 https://cran.r-project.org/src/contrib/Archive/magick/,從1.0測試到2.6 煤杀,無一成功眷蜈。
好吧,這條路也走不通沈自,那我只能去編譯一個最新的imagemagick
spack install imagemagick
spack load imagemagick
# 動態(tài)庫酌儒,沒有這行命令,編譯過程最后一步還是失敗
export LD_LIBRARY_PATH=/home/xzg/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/imagemagick-7.0.8-7-663acxuiasjhkjxymveygisoduukdmpa/lib:$LD_LIBRARY_PATH
然后安裝magick枯途,終于這條路成功了忌怎!
終于,我可以斷定酪夷,果子老師之所以安裝不了magick是因為它的Ubuntu系統(tǒng)里沒有安裝最新的imagemagick底層庫呆躲。之所以,他沒法用下面的語句安裝最新的imagemagick底層庫捶索,是因為它用的是16.04版本Ubuntu插掂。
sudo apt-get update
sudo apt-get install -y libmagick++-dev
不過,問題還是沒有順利的解決腥例,因為我們希望這個包是給所有人用的辅甥,而非自己用。
有兩種方法燎竖,一種是讓其他用戶添加一個環(huán)境變量璃弄,LD_LIBRARY_PATH。
另一種方式构回,當你是root用戶夏块,你就可以在 /etc/ld.so.conf.d/
里加上一個配置文件,比如說我的是纤掸,imagemagick-7.0.8-7-663.conf脐供,里面是lib路徑
/home/xzg/spack/opt/spack/linux-ubuntu18.04-skylake_avx512/gcc-7.5.0/imagemagick-7.0.8-7-663acxuiasjhkjxymveygisoduukdmpa/lib
然后調(diào)用ldconfig
讓配置生效,就可以讓我們自己編譯的動態(tài)庫變成系統(tǒng)級借跪。
故事到這里基本就結(jié)束了政己,只有最后一個小插曲,那就是果子老師最終目標是安裝spatialLIBD
BiocManager::install("spatialLIBD")
但是安裝過程中,另一個R包textshaping出錯掏愁,提示信息如下
--------------------------- [ANTICONF] --------------------------------
Configuration failed to find the harfbuzz freetype2 fribidi library. Try installing:
* deb: libharfbuzz-dev libfribidi-dev (Debian, Ubuntu, etc)
* rpm: harfbuzz-devel fribidi-devel (Fedora, EPEL)
* csw: libharfbuzz_dev libfribidi_dev (Solaris)
* brew: harfbuzz fribidi (OSX)
If harfbuzz freetype2 fribidi is already installed, check that 'pkg-config' is in your
PATH and PKG_CONFIG_PATH contains a harfbuzz freetype2 fribidi.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=...'
-------------------------- [ERROR MESSAGE] ---------------------------
<stdin>:1:10: fatal error: hb-ft.h: No such file or directory
compilation terminated.
--------------------------------------------------------------------
ERROR: configuration failed for package ‘textshaping’
* removing ‘/opt/R-4.2.1/lib/R/library/textshaping’
其實解決思路很簡單歇由,也就是用 apt install libharfbuzz-dev libfribidi-dev
去安裝這個依賴就好。然而果港,沒有那么順利
下列軟件包有未滿足的依賴關(guān)系:
libfribidi-dev : 依賴: libfribidi0 (= 0.19.7-1) 但是 0.19.7-2 正要被安裝
E: 無法修正錯誤沦泌,因為您要求某些軟件包保持現(xiàn)狀,就是它們破壞了軟件包間的依賴關(guān)系
不過辛掠,無所謂了谢谦,我直接用 spack自己裝一份fribidi就好了。
參考資料