尝试在 NixOS 中运行 Clojure 项目时加载共享库时出错

问题描述 投票:0回答:2

我正在尝试在 NixOS 23.05 中运行一个超级简单的 Clojure 项目。

project.clj
文件包含:

(defproject fsm "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
            :url "https://www.eclipse.org/legal/epl-2.0/"}
  :dependencies [[org.clojure/clojure "1.11.1"]
                 [com.phronemophobic/clj-graphviz "0.6.1"]]
  :main ^:skip-aot fsm.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all
                       :jvm-opts ["-Dclojure.compiler.direct-linking=true"]}})

文件

src/fsm/core.clj
包含:

(ns fsm.core
  (:gen-class))

(require '[com.phronemophobic.clj-graphviz :refer [render-graph]])

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!")

  (render-graph {:edges [["a" "b"]]})
  ;; writes to graph.png

  (render-graph {:edges [["a" "b"]]}
                {:filename "my-graph.png"}))

但是当我输入

lein run
时,我收到错误消息:

Execution error (UnsatisfiedLinkError) at com.sun.jna.NativeLibrary/loadLibrary (NativeLibrary.java:323).
Unable to load library 'gvc':
libgvc.so: cannot open shared object file: No such file or directory
libgvc.so: cannot open shared object file: No such file or directory
Native library (linux-x86-64/libgvc.so) not found in resource path (...)

这在其他 Linux 发行版(Pop OS!/Ubuntu)中工作得很好,所以我相信我缺少 NixOS 配置的一些东西。我对这个分布不熟悉。

clojure leiningen nixos
2个回答
0
投票

libgvc.so
是 GraphViz 的一部分。您需要安装 GraphViz 才能访问该库。随心所欲地这样做。

如果您不使用 Flakes 来部署/运行应用程序,安装 GraphViz 最简单的方法是使用 Nix shell,如下所示:

$ nix-shell -p graphviz
$ lein run

您还可以按照安装

graphviz
的方式将
lein
添加到已安装的软件包列表中。


0
投票

libgvc.so
是一个共享对象,当您安装 Graphviz 时,应该安装在您的系统上(请参阅已安装的库此处)。我说“应该”是因为我不确定编译 Graphviz 时是否始终包含 libgvc(Graphviz 上下文库)。 在 NixOS 上安装库与在 Ubuntu 上安装库意味着不同的事情。这是因为 Ubuntu 中的

apt

(与 Linux 发行版中的大多数包管理器一样)下载预编译的二进制文件,而 NixOS 中的

nix
检查所需的工件是否存在于
二进制缓存
中,如果不存在,则进行编译源代码并将工件上传到该缓存。

nixpkgs中的这个NixOS模块

可以看到,Graphviz源代码首先从这个Gitlab存储库中获取,然后使用nativeBuildInputs中声明的工具进行编译。 NixOS 模块还负责确保运行时依赖项在您的系统上可用(请参阅

buildInputs
)。
如果您在 nixpkgs 

中找到的

graphviz

 软件包确实包含 
libgvc,则该软件包可能没问题,您应该仔细检查您的 NixOS 配置。你应该有这样的东西: environment.systemPackages = [ pkgs.graphviz ];

如果您在 nixpkgs 中找到的
graphviz

软件包

不包含
libgvc,您可以制作包含它的派生 额外提示:当您想要快速启动 Clojure 项目时,请使用

dev-templates

© www.soinside.com 2019 - 2024. All rights reserved.