Navicat启动时报“error while loading shared libraries”是因系统未找到其依赖的.so库,需根据缺失库路径选择方案:若在/usr/local/lib等全局路径,执行echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/navicat.conf && sudo ldconfig;若在~/.navicat/plugins等用户路径,需chmod 755对应.so文件并在启动前设置LD_LIBRARY_PATH;若为Flatpak/Snap沙箱安装,则需用flatpak override或snap connect授权路径访问。
Navicat for Linux 启动时报 error while loading shared libraries
这是典型的动态库加载失败,不是 navicat 本身 bug,而是系统找不到它依赖的某个 .so 文件。错误信息里会明确写出缺失的库名,比如 libjson.so.0 或 libmfs_open.so。linux 不像 windows 那样自动扫描当前目录或 path 下的所有 .so,它严格按 /etc/ld.so.cache 缓存的路径列表去查找。
- 先确认缺失库是否真没装:
find /usr -name "libjson.so*" 2>/dev/null或find /opt -name "libmfs_open.so*" 2>/dev/null - 如果找到了(比如在
/usr/local/lib),但 Navicat 还是报错,说明该路径没进系统搜索范围 - 别直接改
LD_LIBRARY_PATH然后运行 Navicat —— 它可能以 sandbox 方式启动,环境变量不继承 - 最稳做法是把路径写进系统级配置:
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/navicat.conf,再执行sudo ldconfig
Navicat 自带的驱动或插件依赖外部库,但权限或路径不对
某些第三方数据库驱动(如达梦、人大金仓)或 Navicat 插件会自带私有 .so,并期望从固定位置加载。常见陷阱是:这些库文件放在了 ~/.navicat/ 下的子目录里,但 Navicat 启动时没把该目录加进 LD_LIBRARY_PATH,或者文件权限是 600(只读,无执行位)。
- 检查库文件权限:
ls -l ~/.navicat/plugins/libxxx.so,必须含x位,至少755 - 临时验证是否权限问题:用
chmod 755 ~/.navicat/plugins/*.so - 若库在用户目录下,不能靠
/etc/ld.so.conf—— 它只对全局路径生效;此时需在 Navicat 启动脚本里显式设置:LD_LIBRARY_PATH="$HOME/.navicat/plugins:$LD_LIBRARY_PATH" ./navicat
Navicat for Linux 使用 Flatpak 或 Snap 打包时的沙箱限制
如果你是从 Flathub 或 Ubuntu Software 安装的 Navicat,它大概率跑在 Flatpak/Snap 沙箱里。这类环境默认禁止访问 /usr/local/lib、/opt 或用户主目录下的任意路径,除非显式授权。
- Flatpak 版本:运行
flatpak override --user com.navicat.Navicat查看当前权限;要开放自定义库路径,执行flatpak override --user --filesystem=/usr/local/lib com.navicat.Navicat - Snap 版本:
snap connections navicat查看挂载点,用snap connect navicat:home :home或snap connect navicat:system-files :system-files授权(注意安全风险) - 绕过沙箱最简单办法:卸载 Flatpak/Snap 版,改用官方提供的
.tar.gz包(解压即用,无沙箱)
为什么 ldd navicat 显示所有依赖“found”,但运行仍报错?
ldd 只检查 Navicat 主程序的直接依赖,而第三方插件或运行时加载的驱动(如 MySQL 的 libmysqlclient.so)是在程序启动后由 dlopen() 动态打开的 —— 这些库的路径不会出现在 ldd 输出里。
- 用
strace -e trace=openat,open,openat64 -f ./navicat 2>&1 | grep '\.so'跟踪实际尝试打开哪些库文件 - 重点看失败行末尾是否是
ENOENT(没找到)或EACCES(权限拒绝) - 某些库还依赖其他库(比如
libssl.so.1.1依赖libcrypto.so.1.1),漏掉任一环都会失败
strace 看它到底在哪儿栽跟头。











