You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级NixOS 20.03后依赖Diesel+MySQL的Rust crate编译失败求助

解决NixOS 20.03下Diesel MySQL特性编译链接失败的问题

我之前在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:47:47