无法加载库 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 文件中的共享库文件,适当地提取和加载它们。
我试图导出我的 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 文件中的共享库文件,适当地提取和加载它们。