Ubuntu22全新安装后执行gsettings命令因缺失GLIBCXX_3.4.29报错的解决方法咨询
Ubuntu22全新安装后执行gsettings命令因缺失GLIBCXX_3.4.29报错的解决方法咨询
你好,我刚在全新安装的Ubuntu 22.04上尝试运行gsettings set org.gnome.mutter check-alive-timeout 500000命令时,也遇到了完全一样的报错:
/snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib/x86_64-linux-gnu/libproxy.so.1)
Failed to load module: /home/alexander/snap/code/common/.cache/gio-modules/libgiolibproxy.so
下面我来给你拆解问题原因和可行的解决办法,帮你理解每个步骤的作用:
问题原因拆解
这个错误的核心是snap环境自带的libstdc++.so.6版本太旧:
- 从报错路径
/snap/core20/current/...能看出来,当前执行gsettings时调用的是snap核心环境(core20)里的C++标准库; - Ubuntu 22.04系统自带的
libproxy.so.1依赖更高版本的GLIBCXX_3.4.29,但core20 snap默认的libstdc++.so.6没有包含这个版本,导致模块加载失败,进而中断gsettings命令。
解决方法(两种可选)
方法一:临时指定库路径(无风险,适合单次执行)
这个方法通过环境变量让程序优先加载系统的新版库,不修改任何系统文件:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 gsettings set org.gnome.mutter check-alive-timeout 500000
- 解释:
LD_PRELOAD是Linux的特殊环境变量,它会告诉系统在加载程序依赖的库之前,先加载我们指定的库。这里让gsettings优先使用系统自带的libstdc++.so.6(Ubuntu22.04的系统库已经包含GLIBCXX_3.4.29),从而满足libproxy.so.1的依赖要求。
方法二:替换snap核心环境的旧库(永久解决,需谨慎)
如果需要长期解决这个问题,可以替换core20 snap里的旧库为系统的新版库,但要先备份避免风险:
- 备份snap里的旧库文件:
sudo cp /snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6 /snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6.bak
- 创建软链接指向系统的新版库:
sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6
- 解释:core20是绝大多数snap应用的基础运行环境,替换它的
libstdc++.so.6后,所有依赖core20的snap程序都会用上系统的新版库。但要注意:如果后续系统库更新导致和snap环境不兼容,可能会引发其他问题,所以备份的文件一定要保留,出问题时可以通过sudo mv /snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6.bak /snap/core20/current/lib/x86_64-linux-gnu/libstdc++.so.6恢复。
额外验证步骤(可选)
你可以先确认系统确实有GLIBCXX_3.4.29版本:
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_3.4.29
如果输出包含GLIBCXX_3.4.29,说明系统库是符合要求的,上面的方法肯定有效。
备注:内容来源于stack exchange,提问作者Alexander Soare
相关产品推荐
相关产品推荐

