Nix环境安装静态libudev库出现p11-kit报错如何解决?
静态构建依赖libudev二进制的解决方案
报错根因
nixpkgs默认的pkgsStatic.libudev继承了systemd的默认编译配置,会启用p11-kit相关的密钥管理功能,而p11-kit本身不支持作为静态库链接,因此直接安装会触发报错。
可选实现方案
方案1:覆盖编译参数切断p11-kit依赖
通过Nix overlay覆盖systemd的编译选项,关闭p11-kit相关功能,即可正常生成静态libudev。将以下内容保存为shell.nix:
let pkgs = import <nixpkgs> { overlays = [ (final: prev: { pkgsStatic = prev.pkgsStatic.overrideScope (sfinal: sprev: { systemd = sprev.systemd.override { withP11Kit = false; }; }); }) ]; }; in pkgs.mkShell { nativeBuildInputs = [ pkgs.pkgsStatic.gcc pkgs.pkgsStatic.pkg-config ]; buildInputs = [ pkgs.pkgsStatic.libudev ]; }
执行nix-shell即可进入可用的静态编译环境,无需全局安装依赖,编译时添加-static参数即可生成静态二进制。
方案2:使用musl目标编译链
如果需要生成可跨Linux发行版分发的静态二进制,可直接使用musl作为libc的编译目标,nixpkgs的musl静态链默认已处理p11-kit的依赖冲突:
nix-shell -p pkgsMusl.libudev pkgsMusl.gcc pkgsMusl.pkg-config
进入环境后直接编译即可,生成的二进制不依赖任何系统动态库。
方案3:单独编译最小静态libudev
如果不需要Nix管理依赖,可直接拉取systemd源码单独编译libudev静态库,关闭所有非必要功能:
# 拉取对应版本的systemd源码 curl -LO https://github.com/systemd/systemd/archive/refs/tags/v254.tar.gz tar -xzf v254.tar.gz && cd systemd-254 # 配置编译参数,仅生成静态libudev meson setup build --default-library=static \ -Dstatic-libudev=true \ -Dp11kit=disabled \ -Dman=false -Dhtml=false -Ddocs=false \ -Dtests=false -Dexamples=false # 编译并安装 ninja -C build udev/libudev.a sudo cp build/udev/libudev.a /usr/local/lib/ sudo cp src/libudev/libudev.h /usr/local/include/
编译自己的业务代码时指定-I/usr/local/include -L/usr/local/lib -ludev -static即可。
内容的提问来源于stack exchange,提问作者dnalor
相关产品推荐
相关产品推荐

