1

我正在使用CIDER完成新发布的Clojure中的Vulkan 教程,但遇到了一些障碍。示例makefile 项目完美运行,但我无法将其转换为 Clojure。

我的build.boot文件只是指定:source-paths并添加LWJGL作为依赖项:

(set-env!
 :source-paths #{"src"}
 :dependencies
 (let [lwjgl-version "3.0.0"]
   [['org.lwjgl/lwjgl lwjgl-version]
    ['org.lwjgl/lwjgl-platform lwjgl-version :classifier "natives-linux"]]))

然后,在 中src/example/core.clj,我有一个extension-count使用vkEnumerateInstanceExtensionProperties原始示例中演示的函数:

(ns example.core
  (:import (org.lwjgl.vulkan VK10)))

(defn extension-count []
  (let [^String layer-name nil
        property-count (int-array 1)]
    (VK10/vkEnumerateInstanceExtensionProperties layer-name property-count nil)
    (first property-count)))

现在,在 Bash 中,我可以设置相关的环境变量LD_LIBRARY_PATH,并VK_LAYER_PATH在启动 REPL 时:

$ VULKAN_SDK_PATH=~/VulkanSDK/1.0.21.1/x86_64 LD_LIBRARY_PATH=$VULKAN_SDK_PATH/lib VK_LAYER_PATH=$VULKAN_SDK_PATH/etc/explicit_layer.d boot repl
boot.user=> (require '[example.core :refer [extension-count]])
nil
boot.user=> (extension-count)
4

如您所见,一切正常。但是,当然,当我改用cider-jack-inby时C-c M-j,我得到一个UnsatisfiedLinkError因为 CIDER 没有设置这些变量:

boot.user> (import (java.util.function Consumer)
                   (org.lwjgl.system Configuration))
org.lwjgl.system.Configuration
boot.user> (Configuration/setDebugStreamConsumer
            (reify Consumer
              (accept [_ message]
                (println message))))
nil
boot.user> (require '[example.core :refer [extension-count]])
nil
boot.user> (extension-count)
[LWJGL] Failed to load a library. Possible solutions:
    a) Set -Djava.library.path or -Dorg.lwjgl.librarypath to the directory that contains the shared libraries.
    b) Add the JAR(s) containing the shared libraries to the classpath.
[LWJGL] Enable debug mode with -Dorg.lwjgl.util.Debug=true for better diagnostics.
java.lang.UnsatisfiedLinkError: Failed to locate library: libvulkan.so.1

我应该设置java.library.pathorg.lwjgl.librarypath,如上述错误消息中所建议的那样,而不是LD_LIBRARY_PATH?我可以设置这些变量中的任何一个profile.boot

(System/setProperty
 "java.library.path"
 (str (System/getProperty "user.home") "/VulkanSDK/1.0.21.1/x86_64/lib"))

现在,当我C-c M-j再次尝试时,它可以工作:

boot.user> (require '[example.core :refer [extension-count]])
nil
boot.user> (extension-count)
4

但是,这仍然不允许我设置VK_LAYER_PATH,这在未来将相当重要:

我们将开始在 Vulkan 中使用验证层,您需要使用VK_LAYER_PATH变量告诉 Vulkan 库从何处加载这些验证层:

test: VulkanTest
    LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/explicit_layer.d ./VulkanTest

如何设置这些环境变量cider-jack-in?我不希望在单独的终端中为独立的 repl手动配置 CIDER 的依赖项,然后使用 连接到它cider-connect,但如果这里没有其他选项,我想这就是我必须做的。

4

0 回答 0