无法加载库 liblwjgl.so

Failed to load library liblwjgl.so

我试图导出我的 lwjgl 游戏的 .jar 文件,以便我可以使用 gradle 将它发送给我的朋友。当我通过键入 java -jar [文件名] 在 /build/libs 中打开 jar 时,出现此错误消息:

[LWJGL] Failed to load a library. Possible solutions:
    a) Add the directory that contains the shared library to -Djava.library.path or -Dorg.lwjgl.librarypath.
    b) Add the JAR that contains the shared library to the classpath.
[LWJGL] Enable debug mode with -Dorg.lwjgl.util.Debug=true for better diagnostics.
[LWJGL] Enable the SharedLibraryLoader debug mode with -Dorg.lwjgl.util.DebugLoader=true for better diagnostics.
Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to locate library: liblwjgl.so
    at org.lwjgl.system.Library.loadSystem(Library.java:164)
    at org.lwjgl.system.Library.loadSystem(Library.java:63)
    at org.lwjgl.system.Library.<clinit>(Library.java:51)
    at org.lwjgl.system.MemoryUtil.<clinit>(MemoryUtil.java:100)
    at org.lwjgl.system.Pointer$Default.<clinit>(Pointer.java:67)
    at org.lwjgl.system.Callback.<clinit>(Callback.java:40)
    at org.example.app.Engine.init(Engine.kt:64)
    at org.example.app.Engine.run(Engine.kt:53)
    at org.example.app.ApplicationKt.main(Application.kt:4)
    at org.example.app.ApplicationKt.main(Application.kt)

我知道这有点说明我需要做什么,但我真的不明白我应该在哪里添加,例如“-Djava.library.path”。

这是我的 build.gradle

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.5.30'
}

group 'org.example'
version '1.0-SNAPSHOT'

project.ext.lwjglVersion = "3.3.0"
project.ext.lwjglNatives = "natives-linux"

repositories {
    mavenCentral()
}

dependencies {
    implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion")

    implementation 'org.joml:joml:1.10.3'
    implementation "org.lwjgl:lwjgl"
    implementation "org.lwjgl:lwjgl-assimp"
    implementation "org.lwjgl:lwjgl-glfw"
    implementation "org.lwjgl:lwjgl-openal"
    implementation "org.lwjgl:lwjgl-opengl"
    implementation "org.lwjgl:lwjgl-stb"
    runtimeOnly "org.lwjgl:lwjgl::$lwjglNatives"
    runtimeOnly "org.lwjgl:lwjgl-assimp::$lwjglNatives"
    runtimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives"
    runtimeOnly "org.lwjgl:lwjgl-openal::$lwjglNatives"
    runtimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives"
    runtimeOnly "org.lwjgl:lwjgl-stb::$lwjglNatives"
}

jar {
    duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
    manifest {
        attributes 'Main-Class': 'org.example.app.ApplicationKt'
    } from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}

sourceSets {
    main {
        resources {
            srcDir 'src/../lib'
        }
    }
}

gradle.properties:

kotlin.code.style=official
org.gradle.jvmargs=-Dkotlin.daemon.jvm.options=--illegal-access=permit

它在 IntelliJ 中工作得很好,只有在尝试在 IDE.

之外打开时才会出错

如果重要的话我正在使用 linux (POP_OS) 并且我正在用 kotlin 编写这个游戏。

您目前没有将 LWJGL 的 运行time natives jar 文件包含到您的 fat jar 文件中。

因此,您无需添加任何 JVM 参数,例如 -Djava.library.path-Dorg.lwjgl.librarypath,而只需确保“natives-linux”dependencies/jar当你 运行 jar 时,文件在类路径中。

在您的情况下实现此目的的一种方法是不仅迭代编译时依赖项,而且迭代 jar 任务中的 运行时间依赖项,以收集这些依赖项并将它们添加到 fat jar 文件中你建造的,因为你肯定 在 运行 时需要它们。

因此,更改此行:

} from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }

至:

} from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }

LWJGL 3 本身将在 运行 时间扫描类路径并检测 jar 文件中的共享库文件,适当地提取和加载它们。