升级NixOS 20.03后依赖Diesel+MySQL的Rust crate编译失败求助
我之前在NixOS跨版本升级时碰到过几乎一模一样的链接问题——MariaDB 10.3的库结构和链接参数确实和10.2有不少变动,直接导致Diesel的MySQL后端在编译时找不到正确的依赖。可以试试下面几个针对性的解决方法:
方法一:手动指定MariaDB库的链接路径
在你的crate根目录下创建或修改.cargo/config文件,添加针对MySQL的链接配置:
[target.x86_64-unknown-linux-gnu] rustflags = [ "-L", "/run/current-system/sw/lib/mariadb/", "-l", "mariadb", ]
如果你的机器是ARM架构,把x86_64-unknown-linux-gnu换成对应的目标三元组(比如aarch64-unknown-linux-gnu)。这个配置会直接告诉Rust编译器去NixOS当前系统的MariaDB库目录找依赖,同时明确指定要链接的mariadb库。
方法二:用nix-shell补全编译依赖
确保你的shell.nix里包含完整的MariaDB开发包,而不是只装运行时的mariadb-server。修改后的shell.nix可以参考:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { buildInputs = with pkgs; [ rustc cargo mariadb.dev # 必须选dev包,包含编译需要的头文件和链接库 pkg-config ]; }
保存后重新进入nix-shell,再执行编译。之前如果只装了mariadb-server,会缺失编译时必需的头文件和静态库,这是很常见的疏漏。
方法三:切换到标准mysqlclient库
如果前两种方法都没效果,可以让Diesel的MySQL后端改用官方的mysqlclient库。修改Cargo.toml里的Diesel依赖:
diesel = { version = "x.y.z", features = ["mysql", "mysqlclient"] }
然后把shell.nix里的mariadb.dev换成mysql.dev,重新进入shell后再编译。这个方法相当于绕过MariaDB的兼容库,直接用原生MySQL客户端库,很多时候能解决版本兼容的链接问题。
必做前置操作:清理旧编译缓存
不管用哪个方法,先清理掉之前的编译缓存,避免旧的链接信息干扰:
cargo clean
我当时用方法一就快速解决了问题,你可以逐个尝试,应该能搞定链接失败的报错。
内容的提问来源于stack exchange,提问作者palik

