如何在NixOS系统下通过cargo安装带sqlite支持的diesel-cli?
问题根因
- NixOS官方源的默认
sqlite包默认仅编译动态库,而diesel的sqlite绑定默认优先尝试静态链接libsqlite3,因此链接器无法找到对应静态库文件 - NixOS不会将第三方库的头文件、库文件路径默认加入全局编译器搜索路径,即使你安装了
sqlite和pkg-config,普通shell环境下cargo调用链接器时也无法定位到sqlite的库文件 - postgres包默认同时提供静态、动态库且pkg-config配置能被正常识别,因此编译postgres版本不会出错
解决方法
方案1:单次编译diesel-cli临时解决
直接通过nix-shell加载带静态库的sqlite依赖,执行安装命令即可:
nix-shell -p pkg-config rustc cargo 'sqlite.override { static = true; }' --run "cargo install diesel_cli --no-default-features --features sqlite"
如果你想要动态链接sqlite,只需要去掉override参数,同时指定禁用diesel的静态链接选项即可:
nix-shell -p pkg-config rustc cargo sqlite --run "DIESEL_SQLITE_STATIC=0 cargo install diesel_cli --no-default-features --features sqlite"
方案2:适配日常Rust项目开发
如果你后续开发Rust项目时也需要链接sqlite,推荐给项目根目录创建shell.nix文件,内容如下:
with import <nixpkgs> {}; mkShell { buildInputs = [ rustc cargo pkg-config # 动态链接用这个 sqlite # 静态链接替换成下面这个 # (sqlite.override { static = true; }) ]; # 配置pkg-config搜索路径,确保cargo能找到sqlite的配置 PKG_CONFIG_PATH = "${sqlite.dev}/lib/pkgconfig"; }
之后每次进入项目目录,先执行nix-shell进入开发环境,再执行cargo build/cargo run等命令都不会出现链接报错。
内容的提问来源于stack exchange,提问作者manews
相关产品推荐
相关产品推荐

