Ubuntu 解决“/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0:undefined symbol:FT_Get_Var_Blend_Coordinates”的问题

最近一直在折腾 Ubuntu ,今天就遇到了一个很大的坑:在安装英伟达官方显卡驱动后启动时出现:

ERROR: /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined symbol:
       FT_Get_Var_Blend_Coordinates
       libnvidia-gtk3.so: cannot open shared object file: No such file or
       directory
       /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined symbol:
       FT_Get_Var_Blend_Coordinates
       libnvidia-gtk2.so: cannot open shared object file: No such file or
       directory

的错误,关键就是这个“libharfbuzz.so.0”和“FT_Get_Var_Blend_Coordinates”,安装的深度截图打开时也会出现这个错误,于是就在谷歌上找解决方法。在 GitHub 上找到了很多同样问题的 Issues,有人解答说是 harfbuzz 调用了有问题的 freetype 库。这个 freetype 是一个完全免费(开源)的、高质量的且可移植的字体引擎,而”harfbuzz“是用于文字塑形的软件开发库,这两者都是很多软件开发中用到的库。问题的根源找到了,那就想办法解决吧。

零、解决方法一

根据搜索出来的问题来看,很多都是因为安装了第三方的 freetype,而我不记得有安装过这个东西,就在 /usr/local 目录下找了一下,果然:

root@sunriseydy:~# find /usr/local/ -name freetype
/usr/local/freetype
/usr/local/freetype/include/freetype2/freetype
root@sunriseydy:~# 

有一个”/usr/local/freetype“的文件夹,于是,把它删了(当然删之前最好备份一下):

root@sunriseydy:~# rm -rf /usr/local/freetype

神奇的事情出现了,问题解决了!!! :(惊哭)

当然,你可能真的安装了其他的freetype,如果是,就尝试卸载删除它,也有可能你是真的没有freetype这个库,那么你就可以用编译安装的方法去安装它。我编译安装了一个最新版的freetype,发现它最后将编译好的库放到了”/usr/local/include/freetype2/freetype” 目录下,既然是库文件,在”include“目录下才算正常嘛 :(呵呵)

这里顺便说一下如何编译安装freetype,毕竟我也折腾了好久。

一、下载freetype

它的官网是:https://www.freetype.org/,下载地址有两个:https://download.savannah.gnu.org/releases/freetype/ 和 https://sourceforge.net/projects/freetype/files/。我下的是 freetype-2.9.1.tar.gz ,下载好后将源码解压:

sunriseydy@sunriseydy:~/Downloads/Archive$ tar -xzf freetype-2.9.1.tar.gz

接下来就是编译安装了。

二、编译 freetype

官方有一个编译的说明文档,在“freetype/docs/INSTALL.UNIX”文件中,英语好的可以看一看。不想看英文文档的可以继续看下面的内容。

首先要安装一些依赖包:

  automake (1.10.1)
  libtool (2.2.4)
  autoconf (2.62)

就是这三个软件包,括号里的是这些包的最低版本,应该都已经安装上了,可以用 apt 命令来安装一下(注意这里我已经切换为root用户,接下来的步骤都是以root用户执行的):

root@sunriseydy:~# apt install automake libtool autoconf
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
autoconf 已经是最新版 (2.69-11)。
automake 已经是最新版 (1:1.15.1-3ubuntu2)。
libtool 已经是最新版 (2.4.6-2)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
root@sunriseydy:~# 

可以看到这三个包都已经安装过了,并且版本也大于需求的版本,那么就直接开始配置并编译了。

1.生成配置

首先是根据系统自动生成配置文件,方法是执行 freetype 目录下的 autogen.sh 文件(下面的步骤中均在freetype目录下执行命令):

root@sunriseydy:~/freetype-2.9.1# ./autogen.sh 
generating `configure.ac'
running `aclocal -I . --force'
running `libtoolize --force --copy --install'
libtoolize: putting auxiliary files in '.'.
libtoolize: copying file './config.guess'
libtoolize: copying file './config.sub'
libtoolize: copying file './install-sh'
libtoolize: copying file './ltmain.sh'
libtoolize: Consider adding 'AC_CONFIG_MACRO_DIRS([m4])' to configure.ac,
libtoolize: and rerunning libtoolize and aclocal.
libtoolize: Consider adding '-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
running `autoconf --force'

结果如上。

2.执行配置文件

运行

./configure

大概会出现这样的结果:

root@sunriseydy:~/freetype-2.9.1# ./configure 
...
configure:

Library configuration:
  external zlib: yes (pkg-config)
  bzip2:         yes (autoconf test)
  libpng:        yes (pkg-config)
  harfbuzz:      yes (pkg-config)

make: 对“unix”无需做任何事。
root@sunriseydy:~/freetype-2.9.1# 

接着就是编译了。

3.编译

执行

make

命令来编译,编译过程视性能好坏长短不一,如果没报错就可以将编译好的库安装到系统中了。

4.安装编译结果

执行

make install

来将编译好的结果安装到系统库中。

5.最终结果

安装也没出错的话,在/usr/local目录中搜索freetype应该是这样的:

root@sunriseydy:~/freetype-2.9.1# find /usr/local/ -name freetype
/usr/local/include/freetype2/freetype

总结

基本上“/usr/lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined symbol:FT_Get_Var_Blend_Coordinates”的问题根源就是freetype,所以通过安装官方的freetype就可以解决该问题了。


版权说明:
作品 sunriseydy 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
文章内容如未说明均为原创,欢迎转载,但请注明原作者(sunriseydy)和原文链接(https://blog.sunriseydy.top/technology/server-blog/server/resolve-undefined-symbol-ft_get_var_blend_coordinates/)
部分来自互联网的文章,如有侵权,请联系我,24小时内删除,谢谢

分享到微博 分享到QQ 微信赞赏 点赞 0

评论一下呗亲

电子邮件地址不会被公开。 必填项已用*标注