当前位置: 首页 > 工具软件 > libpinyin > 使用案例 >

centos8下ibus-libpinyin不能出现输入框的问题

太叔富
2023-12-01

centos8下用yum install libpinyin之后,始终不能出现输入悬浮框,无法进行中文输入 ,但中文输入法的相关相关设置都没有问题。查看系统日志messages发现其中只出现这样的错误:
Unable to connect to ibus: Could not connect: Connection refused。

原先以为是gdk与ibus兼容的问题,试图重新编译ibus和ibus-libpinyin,在编译过程中需要解决依赖库的源码问题太多,遂暂时放弃。在这其中试图多次重装系统也未解决这问题,中间还导致与windows共存的一个分区被删除,丢失文件无算。网上查找各种方法无果,包括设置环境变量等等。

ps -ef|grep ibus, 发现加载的模块中没有ibus-engine-libpinyin,但其他的进程都有,说明ibus服务本本身没有问题,有问题的ibus-engine-libpinyin没有加载成功。
既然ibus-engine-libpinyin是个可执行文件,试图直接运行或者直接ld这个文件,出现kyotocabinet::File:rename symbol lookup error 错误,说明在动态链接时出现找不到符号的错误。于是ldd ibus-engine-libpinyin,发现与kyotocabinet相关的库为libkyotocabinet.so.16。

执行
readelf -sW libkyotocabinet.so.16|grep rename从libkyotocabinet.so.16查找rename
发现其对应的符号为
ZN12kyotocabinet4File6renameERKSsS2
经过c++filt转换后之后发现函数原型为:
kyotocabinet::File::rename(std::basic_string<char, std::char_traits, std::allocator > const&, std::basic_string<char, std::char_traits, std::allocator > const&)

发现函数是存在的,怀疑为kyotocabinet库版本的问题,
于是从kyotocabinet下载
下载最新的源码,进行编译,编译出libkyotocabinet.so.16库,
编译好后执行readelf -sW libkyotocabinet.so.16|grep rename,发现rename对应的符号
ZN12kyotocabinet4File6renameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8
经过c++filt转换后之后发现函数原型为
kyotocabinet::File::rename(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&)

可以发现函数原型在basic_string前面出现了cxx11,说明gcc的版本直接用了c11的标准编译c++,导致ibus-libpinyin找不到符号,说明yum源上的ibus-libpinyin编译用的是c11标准进行的编译,而其yum源上的libkyotocabinet.so.16版本不是用c++11标准进行编译的,导致出现错误。

最后解决办法:
用源代码编译出的libkyotocabinet.so.16,删除/lib64/libkyotocabinet.so.16,copy编译出的版本到lib64目录下,删除目录下的软链接,重新生成软链接,然后ldconfig即可。

 类似资料: