代码之家  ›  专栏  ›  技术社区  ›  Jeff

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

  •  0
  • Jeff  · 技术社区  · 1 年前

    我试图在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配置的一些东西。我不熟悉这种分布。

    0 回复  |  直到 1 年前
        1
  •  1
  •   E.T.    1 年前

    libgvc.so 是GraphViz的一部分。您需要安装GraphViz才能访问该库。随你怎么做。

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

    $ nix-shell -p graphviz
    $ lein run
    

    您还可以添加 graphviz 以与安装相同的方式添加到已安装的软件包列表中 lein .

        2
  •  1
  •   jackdbd    1 年前

    那个 libgvc.so 是一个共享对象 应该 在安装Graphviz时安装在您的系统上(请参阅已安装的库 here ). 我说 应该 因为我不确定编译Graphviz时是否总是包含libgvc(Graphviz上下文库)。

    在NixOS上安装库意味着与在Ubuntu上安装库不同的事情。这是因为 apt 在Ubuntu中(像Linux发行版中的大多数包管理器一样)下载预编译的二进制文件,而 nix 在NixOS中检查所需工件是否存在于 binary cache ,如果它不存在,它会编译源代码并将工件上传到该缓存。

    如您所见 this NixOS module in nixpkgs ,Graphviz源代码首先从以下位置获取 this Gitlab repository ,然后使用中声明的工具进行编译 nativeBuildInputs 该NixOS模块还负责确保运行时依赖关系在您的系统上可用(请参阅 buildInputs ).

    如果 graphviz 您在nixpkgs中找到的软件包 确实包括 libgvc,该软件包可能很好,您应该仔细检查您的NixOS配置。你应该有这样的东西:

    environment.systemPackages = [
      pkgs.graphviz
    ];
    

    如果 石墨 您在nixpkgs中找到的软件包 不包括 libgvc,你可以做一个 derivation 这包括它。

    你也可以尝试编译一个包含Graphviz的小程序,并使用 ldd 查找链接器无法找到的所有共享对象。

    ldd your-graphviz-program | grep 'not found'
    

    另请参阅它是如何完成的 here .

    额外提示:当你想引导一个快速的Clojure项目时,使用 dev-templates .