我有几个商业应用程序依赖于 FFMPEG 或子依赖项 libpango 以及其他可能依赖项。其中一个软件包在我的系统上出现故障,因为 FFMPEG 或 libpango 的版本和编译选项现在与 Ubuntu 原版不同。我不确定哪些程序依赖 FFMPEG 或 libpango 作为依赖项,或者如何找出使用的版本。
原始错误:
ffmpeg: symbol lookup error: /lib/x86_64-linux-gnu/libpango-1.0.so.0: undefined symbol: hb_glib_script_to_script
如果我检查 libpango 是否有该符号,我会发现它没有:
> readelf -a /lib/x86_64-linux-gnu/libpango-1.0.so.0 | grep hb_glib_script_to_script
85: 0000000000000000 0 FUNC GLOBAL DEFAULT UND hb_glib_script_to_script
我检查了其他位置,例如 /usr/local 和 ~/.snap/*,libpango 的那些实例也将该符号列为未定义。
我想知道某个软件包是否可能包含冲突的库版本,而该版本可能会被覆盖。但我没有看到任何迹象。
> apt-cache rdepends --installed ffmpeg
ffmpeg
Reverse Depends:
bitwig-studio
ffmpeg:i386
imagemagick-6.q16
ffmpeg:i386
imagemagick-6.q16
ffmpeg:i386
检查符号错误时,我遇到了以下问题: https://unix.stackexchange.com/questions/599152/debian-libpangoft2-1-0-so-0-undefined-symbol-hb-glib-script-from-script
它建议重新安装libharfbuzz0b
应该提供符号的底层库。我重新安装了它:
> sudo apt update && sudo apt reinstall libharfbuzz
我仍然收到此错误。
然后我检查了 FFMPEG 是否有多个实例,结果没有。libpango 有多个副本,但重复项位于 ~/.snap 中,在系统版本之前不应解析。
答案1
底层库libharfbuzz0b
包含在 Bitwig 特定文件夹中:/opt/bitwig-studio/lib
,但是它们的构建未导出符号。由于某种原因,程序范围的 .so 文件覆盖了系统共享对象,从而导致了此问题。
我通过运行以下命令来追踪该库的依赖关系:
ldd /lib/x86_64-linux-gnu/libpango-1.0.so.0
这表明在预期位置有适当的文件。运行:
> readelf -s /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 | grep hb_glib_script_to_script
439: 00000000000cdff0 9 FUNC GLOBAL DEFAULT 14 hb_glib_script_to_script
显示它应该在那里。我通过运行locate来查找任何实例来追踪问题libharfbuzz
> locate libharfbuzz | grep .so
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0
/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0.20600.4
/opt/bitwig-studio/lib/bitwig-studio/libharfbuzz.so.0
/opt/bitwig-studio/lib/jre/lib/libharfbuzz.so
显示该文件实际上直接包含在 Bitwig 中。运行readelf -s /opt/bitwig-studio/lib/bitwig-studio/libharfbuzz.so.0
符号未定义。