NixOS下如何将libayatana-appindicator别名设为ayatana-appindicator3-0.1?
解决NixOS上Flutter构建LocalSend的ayatana-appindicator依赖问题
下面是几个可行的解决方案,按从临时到持久的顺序排列:
临时快速解决:在shell中创建pkg-config别名
- 先启动包含所需依赖的nix-shell:
nix-shell -p libayatana-appindicator gtk3 pkg-config flutter
- 找到libayatana-appindicator的.pc文件位置:
pkg-config --variable pc_path pkg-config | tr ':' '\n' | xargs -I {} ls {} | grep ayatana
输出一般是/nix/store/[hash]-libayatana-appindicator-[version]/lib/pkgconfig/libayatana-appindicator3.pc这样的路径。
3. 临时复制并改名.pc文件,让pkg-config能识别:
mkdir -p ~/.pkgconfig cp /nix/store/[上面找到的完整路径]/libayatana-appindicator3.pc ~/.pkgconfig/ayatana-appindicator3-0.1.pc
- 把临时目录加入pkg-config的搜索路径:
export PKG_CONFIG_PATH="$HOME/.pkgconfig:$PKG_CONFIG_PATH"
现在执行flutter run就能正常编译了。
持久化解决:用Nix表达式包装依赖
创建一个shell.nix文件,通过override给libayatana-appindicator添加别名.pc文件:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { buildInputs = [ pkgs.flutter pkgs.gtk3 pkgs.pkg-config (pkgs.libayatana-appindicator.overrideAttrs (oldAttrs: { postInstall = (oldAttrs.postInstall or "") + '' ln -s $out/lib/pkgconfig/libayatana-appindicator3.pc $out/lib/pkgconfig/ayatana-appindicator3-0.1.pc ''; })) ]; }
之后每次执行nix-shell进入环境,直接运行flutter run即可,不用重复设置。
另一种临时方案:修改system_tray的CMake配置
如果不想折腾Nix环境,也可以直接修改LocalSend依赖的system_tray包的配置:
找到项目中linux/CMakeLists.txt(在flutter pub get下载的system_tray包目录里,一般在.pub-cache/hosted/pub.dev/system_tray-[version]/linux/),把这一行:
pkg_check_modules(ayatana-appindicator REQUIRED ayatana-appindicator3-0.1)
改成:
pkg_check_modules(ayatana-appindicator REQUIRED libayatana-appindicator3)
改完后重新执行flutter run就能编译通过,不过注意这个修改会在包更新后被覆盖,适合临时构建。
内容的提问来源于stack exchange,提问作者Caesarovich
相关产品推荐
相关产品推荐

