旧版本Ubuntu安装magick出现undefined symbol的解决思路

2023-11-04

太长不看版

  • magick的安装需要底层的imagemagick支持
  • Ubuntu16.04由于版本老旧,安装的旧版imagemagick无法使用
  • 使用spack自己安装新版,可以解决编译问题。

果子老师向我求助,让我帮忙安装一个R包, magick。这个R包,我在自己的CentOS系统的服务器上安装过,在我的Mac上装过,我觉得应该不是个大问题。

然而,从最后我所花的时间来看,这确实是个大问题,因为这是果子老师提出的问题,但凡是他提出的问题,他肯定是前期花了点时间的,也就是常规的路子都走过了,实在没法子才来找我出手。

这个信息的报错消息如下

magick.so: undefined symbol: _ZNK6Magick8GeometrycvNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEv

我通过检索,发现有人通过设置~/.R/Makevars里的C++配置解决过

CXX11=/usr/bin/g++

但是,我测试过了这个方法,并不可行。不过,在这个思路下,我有两个猜测

  • R语言版本或许要最新版4.2.2,这是最简单的思路。很大一部分问题都可以通过升级R来解决。
  • GCC版本低,无法提供magick所要求的库。

对于第一个猜想,我编译了最新R4.2.2, 但是发现并不是原因。

对于第二个猜想,我得编译一个gcc,这个我在2018年的【无root权限下解决编译时的依赖问题】中介绍过,但是那个操作太复杂了,现如今可以考虑用spack(https://spack.io/)。

# 关于spack的安装和使用,不在此文介绍
spack install gcc
spack load gcc

但是,基于最新的GCC去编译R包依旧不行,甚至,基于最新的GCC编译的最新的R也不行。此时,我的心态有点暴躁,于是,我想着要不要就不在这台服务器上编译了,用另一台Ubuntu服务器编译好,复制过来不就好了吗?

但是,由于两台机子的Ubuntu版本不同,结果有依赖库的问题

错误: 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

尽管失败了,但是我有了一个新的猜想, 那就是系统自带的Magick的版本低了。有没有一种可能,在R里,我安装旧版本的magick就可以避免这个问题呢?于是,我找到了它的历史存档 https://cran.r-project.org/src/contrib/Archive/magick/,从1.0测试到2.6 ,无一成功。

好吧,这条路也走不通,那我只能去编译一个最新的imagemagick

spack install imagemagick
spack load imagemagick

# 动态库,没有这行命令,编译过程最后一步还是失败
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系统里没有安装最新的imagemagick底层库。之所以,他没法用下面的语句安装最新的imagemagick底层库,是因为它用的是16.04版本Ubuntu。

sudo apt-get update
sudo apt-get install -y libmagick++-dev

不过,问题还是没有顺利的解决,因为我们希望这个包是给所有人用的,而非自己用。

有两种方法,一种是让其他用户添加一个环境变量,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

然后调用ldconfig 让配置生效,就可以让我们自己编译的动态库变成系统级。

故事到这里基本就结束了,只有最后一个小插曲,那就是果子老师最终目标是安装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去安装这个依赖就好。然而,没有那么顺利

下列软件包有未满足的依赖关系:
 libfribidi-dev : 依赖: libfribidi0 (= 0.19.7-1) 但是 0.19.7-2 正要被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

不过,无所谓了,我直接用 spack自己装一份fribidi就好了。

参考资料

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

旧版本Ubuntu安装magick出现undefined symbol的解决思路 的相关文章

  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 如何安装和管理多个版本的 R 包

    我正在开发一个使用 R 进行可重现计算的框架 我正在努力解决的一个问题是 某些 R 代码可能在包的 X Y Z 版本中完美运行 但是为什么你在 3 年后尝试重现它 这些包已经更新了 一些功能发生了变化 代码不再运行 此问题还会影响使用包的
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 在 WSL Ubuntu 20.04 上安装 npm 后,我收到消息“/usr/bin/env: ‘bash\r’: No such file or directory”

    运行时我看到以下消息npm install or npm来自终端的命令 执行中node按预期工作 gt npm install usr bin env bash r No such file or directory 2023 年 7 月更
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u

随机推荐

  • pidstat命令详解

    一 命令介绍 pidstat是sysstat工具中的一个命令 用于监控进程的cpu 内存 线程 IO及上下文切换等系统资源的占用情况 格式 pidstat options
  • SpringCloud-注册中心简单了解与使用

    前言 什么是SpringCloud 什么是微服务 能干什么 为什么要用SpringCloud 注册中心 什么是SpringCloud 大家都知道SpringCloud是一种微服务架构 模式 SpringCloud简单来说就是微服务架构技术落
  • ArrayList非线程安全记录

    一 问题描述 线上一个查询服务 偶尔会报一次查询出来的结果集合包含null 二 问题排查 在多线程查询过程中 使用了ArrayList 多线程查询出来后执行ArrayList add 然而ArrayList并不是线程安全的集合 会导致nul
  • linux红帽8怎么安yum,RedHat Linux 8本地Yum源配置方法

    1 挂载系统光盘到 mnt cdrom目录 mkdir p mnt cdrom mount dev sr0 mnt cdrom 2 设置系统启动后将光盘自动挂载到 mnt cdrom echo dev sr0 mnt cdrom iso96
  • 电商数据分析实战第一篇——客户消费行为分析

    一 分析背景 为了提高店铺的收益 进行准确的客户运营策略 使用店铺201910至202002的销售数据进行分析 根据客户的消费趋势 消费习惯把握客户的消费现状和心理 挖掘出高价值用户群体 完善销售运营策略 简单说明一下 客户分析包括基本属性
  • Upload LABS Pass-8

    第八关在后端使用了黑名单 并过滤了大小写 点以及空格 但并未过滤数据流 我们使用代理拦截请求 在文件后缀名中添加数据流 绕过黑名单 准备一个 8 php 文件 内容为一句话木马 上传 8 php 文件 并使用代理 此处使用 Burp Sui
  • JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中 使用到JSON进行数据的传递 特别是从前端传递到后台 前台可以直接采用ajax的data函数 按json格式传递 后台Request即可 但有的时候 需要传递多个参数 后台使用request进行接收 有时传递了几个数值 还好
  • 嵌套和递归使用模板类

    嵌套和递归使用模板类 模板栈 模板数组 栈中嵌套数组 数组中嵌套栈 数组中嵌套数组 模板栈 pragma once include
  • 计算机网络——网络层

    这篇文章是计算机网络系列文章的第三篇 计算机网络 物理层 计算机网络 数据链路层 计算机网络 网络层 计算机网络 传输层 计算机网络 应用层 序言 计算机网络中的网络层在当今的社会起到了什么作用 现在的互联网通信 远程办公和远程教育 电子商
  • 基于Dragonboard 410c进行开发的远程遥控机器人(三)

    前面说过 买的camera的夹层板要直接连到410c开发板上 这样96boards 就没有接口去连接了 无奈 智能自己飞线了 开始还担心 这样连接板子会不会出问题 经过最终的验证 发现是可以的 完全没有影响 接下来看一下最后的验证 图 远程
  • 安卓keytool获取不到签名文件的MD5

    目前通过 keytool list v keystore xxx jks 这种方法获取签名的md5时 只能显示SHA1和SHA256 不显示md5 解决办法 1 先将自己的keystore配置进app下的build gradle中 2 打开
  • 关键字参数和可选参数

    通常Fortran的实参和形参的参数数量以及类型必须是匹配的 但是如果过程接口是显式的 那么就可以改变参数表中调参数的顺序 或为过程的某些iochengde形参特别指定实参 通过将过程放在模块中 并在调用程序中用use关联访问模块 可以显式
  • C#中的BeforeFieldInit

    今天学习设计模式中的单例模式 无意间发现了这个标志BeforeFieldInit 于是简单地搜索了一下 总结出如下内容 The C specification states The static constructor for a clas
  • Doris--基础--11--动态分区

    Doris 基础 11 动态分区 1 介绍 对表级别的分区实现生命周期管理 TTL 减少用户的使用负担 1 1 功能 动态添加分区 动态删除分区 1 2 原理 在某些使用场景下 用户会将表按照天进行分区划分数据 在没有动态分区功能的时候 用
  • 2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学B组试题B杨辉三角形

    这题目很简单 问题是细节处理处理很重要 在蓝桥杯省赛中你只要搞对一两道题目就有省三了 实施代码 include
  • 做PPT设计半年赚8万,我是怎样做到的?

    下班做PPT 半年赚8万是什么感觉 你好 我是佳佳 一个用PPT兼职赚钱的宝妈 我现在每天抽2个小时 坐在电脑前 把各种素材像拼图一样拼接一下 像这样 然后把成稿投稿到设计平台 就能赚到钱 你是不是觉得 我是个职业设计师 挺厉害的 不是的
  • java 抽象类初始化_java-抽象类初始化

    我有一个抽象类 abstract class Shape public String color public Shape public void setColor String c color c public String getCol
  • 脚本自动化部署docker微服务,取代Jenkins

    由于Jenkins容器化部署 容器容器之间拷贝文件及其繁琐 如果在Jenkins部署在系统外层也需要配置复杂的流程才能实现微服务的自动化部署 本文主要通过脚本方式取代Jenkins实现自动化部署 脚本方式简单快捷 可以快速实现微服务部署 升
  • MyBatis 快速学习01:第一个程序

    目录 MyBatis简介 什么是MyBatis 为什么需要MyBatis MyBatis框架部署 项目目录结构 搭建实验数据库 创建maven项目 添加mybatis依赖 编写mybatis配置文件 编写MyBatis工具类 创建实体类 编
  • 旧版本Ubuntu安装magick出现undefined symbol的解决思路

    太长不看版 magick的安装需要底层的imagemagick支持 Ubuntu16 04由于版本老旧 安装的旧版imagemagick无法使用 使用spack自己安装新版 可以解决编译问题 果子老师向我求助 让我帮忙安装一个R包 magi