如何在NixOS 20.09上安装或编译libmysqlclient.so.18依赖库
解决NixOS 20.09环境下缺失libmysqlclient.so.18的可行方案
方案1:直接复用历史版本的预编译软件包
libmysqlclient.so.18是MySQL 5.7系列对应的客户端共享库版本,你当前系统默认的libmysqlclient.so.21是MySQL 8.0的版本——NixOS 20.09分支在后续迭代中默认将MySQL依赖升级到了8.0版本,但同分支的早期提交中是存在MySQL 5.7的预编译包的,不需要手动从零编译。
具体操作:
- 通过nix的通道拉取同分支早期提交的mysql57包,临时在shell环境中加载:
如果使用旧版nix命令,可替换为nix shell nixpkgs/release-20.09#mysql57 --command bashnix-shell -p mysql57 --run bash实现等价的临时环境加载效果 - 进入加载好依赖的shell后,先检查目标二进制的依赖解析情况:
正常情况下这里会显示ldd /path/to/your/closed-source-software | grep mysqlclientlibmysqlclient.so.18 => /nix/store/xxx-mysql57-5.7.xx/lib/libmysqlclient.so.18的路径,说明依赖已经能被正常解析。 - 如果需要长期稳定运行,可以用nix wrapper或者
buildFHSUserEnv把这个mysql57的依赖和你的目标二进制绑定,运行时自动注入对应库的搜索路径,完全不需要修改系统全局的库配置。
方案2:自定义nix derivation编译指定版本客户端
如果历史渠道找不到匹配版本的预编译包,可以在nix的隔离编译环境中手动构建只包含客户端的MySQL 5.7组件:
- 编写简单的nix derivation,指定MySQL 5.7对应release的源码地址,编译参数关闭服务端模块、冗余功能,仅构建客户端共享库,大幅降低编译耗时和体积。
- 编译完成后,产出的nix store目录下会自带可用的
libmysqlclient.so.18文件,按照方案1的运行时依赖注入逻辑加载即可。
操作避坑
- 不要尝试手动创建软链接,把系统现有的libmysqlclient.so.21改名为libmysqlclient.so.18凑依赖——MySQL 5.7和8.0的客户端ABI存在大量不兼容变更,这种操作会直接导致程序运行时段错误、函数符号缺失等难以排查的问题。
- 不要手动把编译得到的.so文件复制到系统全局的库目录,NixOS的系统路径受nix store严格管控,手动散落的文件会破坏系统的完整性校验,所有依赖引入都要通过nix的声明式配置完成,不会和系统已安装的高版本MySQL客户端产生冲突。
内容的提问来源于stack exchange,提问作者Ren Yongxin
相关产品推荐
相关产品推荐

