Home > Blockchain >  LWJGL - Failed to locate library: liblwjgl.dylib in IntelliJ IDEA
LWJGL - Failed to locate library: liblwjgl.dylib in IntelliJ IDEA

Time:10-07

I'm trying to run the example code from https://www.lwjgl.org/guide on macOS Big Sur 11.6 (Apple M1 chip). I imported all of the necessary libraries and wrote -XstartOnFirstThread in VM options and got this error:

[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.dylib
    at org.lwjgl.system.Library.loadSystem(Library.java:162)
    at org.lwjgl.system.Library.loadSystem(Library.java:62)
    at org.lwjgl.system.Library.<clinit>(Library.java:50)
    at org.lwjgl.system.MemoryUtil.<clinit>(MemoryUtil.java:97)
    at org.lwjgl.system.Pointer$Default.<clinit>(Pointer.java:67)
    at org.lwjgl.system.Callback.<clinit>(Callback.java:41)
    at com.company.HelloWorld.init(HelloWorld.java:38)
    at com.company.HelloWorld.run(HelloWorld.java:23)
    at com.company.HelloWorld.main(HelloWorld.java:113)


I've tried manually extracting natives from other jars to a separate "native/" folder in the project folder and passing -Dorg.lwjgl.librarypath=native as a VM option but it changed absolutely nothing. I don't know if I should add the "native/" folder to libraries but it also seems to have no impact on the result.

Here is the example code from the LWJGL website:

package com.company;
import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;

import java.nio.*;

import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;

public class HelloWorld {

    // The window handle
    private long window;

    public void run() {
        System.out.println("Hello LWJGL "   Version.getVersion()   "!");

        init();
        loop();

        // Free the window callbacks and destroy the window
        glfwFreeCallbacks(window);
        glfwDestroyWindow(window);

        // Terminate GLFW and free the error callback
        glfwTerminate();
        glfwSetErrorCallback(null).free();
    }

    private void init() {
        // Setup an error callback. The default implementation
        // will print the error message in System.err.
        GLFWErrorCallback.createPrint(System.err).set();

        // Initialize GLFW. Most GLFW functions will not work before doing this.
        if ( !glfwInit() )
            throw new IllegalStateException("Unable to initialize GLFW");

        // Configure GLFW
        glfwDefaultWindowHints(); // optional, the current window hints are already the default
        glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation
        glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable

        // Create the window
        window = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL);
        if ( window == NULL )
            throw new RuntimeException("Failed to create the GLFW window");

        // Setup a key callback. It will be called every time a key is pressed, repeated or released.
        glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
            if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
                glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop
        });

        // Get the thread stack and push a new frame
        try ( MemoryStack stack = stackPush() ) {
            IntBuffer pWidth = stack.mallocInt(1); // int*
            IntBuffer pHeight = stack.mallocInt(1); // int*

            // Get the window size passed to glfwCreateWindow
            glfwGetWindowSize(window, pWidth, pHeight);

            // Get the resolution of the primary monitor
            GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());

            // Center the window
            glfwSetWindowPos(
                window,
                (vidmode.width() - pWidth.get(0)) / 2,
                (vidmode.height() - pHeight.get(0)) / 2
            );
        } // the stack frame is popped automatically

        // Make the OpenGL context current
        glfwMakeContextCurrent(window);
        // Enable v-sync
        glfwSwapInterval(1);

        // Make the window visible
        glfwShowWindow(window);
    }

    private void loop() {
        // This line is critical for LWJGL's interoperation with GLFW's
        // OpenGL context, or any context that is managed externally.
        // LWJGL detects the context that is current in the current thread,
        // creates the GLCapabilities instance and makes the OpenGL
        // bindings available for use.
        GL.createCapabilities();

        // Set the clear color
        glClearColor(1.0f, 0.0f, 0.0f, 0.0f);

        // Run the rendering loop until the user has attempted to close
        // the window or has pressed the ESCAPE key.
        while ( !glfwWindowShouldClose(window) ) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer

            glfwSwapBuffers(window); // swap the color buffers

            // Poll for window events. The key callback above will only be
            // invoked during this call.
            glfwPollEvents();
        }
    }

    public static void main(String[] args) {
        new HelloWorld().run();
    }

}

jars:

lwjgl-assimp-javadoc.jar    lwjgl-nanovg-sources.jar    lwjgl-par-javadoc.jar
lwjgl-assimp-sources.jar    lwjgl-nanovg.jar            lwjgl-par-sources.jar
lwjgl-assimp.jar            lwjgl-nuklear-javadoc.jar   lwjgl-par.jar
lwjgl-bgfx-javadoc.jar      lwjgl-nuklear-sources.jar   lwjgl-sources.jar
lwjgl-bgfx-sources.jar      lwjgl-nuklear.jar           lwjgl-stb-javadoc.jar
lwjgl-bgfx.jar              lwjgl-openal-javadoc.jar    lwjgl-stb-sources.jar
lwjgl-glfw-javadoc.jar      lwjgl-openal-sources.jar    lwjgl-stb.jar
lwjgl-glfw-sources.jar      lwjgl-openal.jar            lwjgl-vulkan-javadoc.jar
lwjgl-glfw.jar              lwjgl-opengl-javadoc.jar    lwjgl-vulkan-sources.jar
lwjgl-javadoc.jar           lwjgl-opengl-sources.jar    lwjgl-vulkan.jar
lwjgl-nanovg-javadoc.jar    lwjgl-opengl.jar            lwjgl.jar

natives:

lwjgl-assimp-natives-macos.jar  lwjgl-natives-macos.jar         lwjgl-par-natives-macos.jar
lwjgl-bgfx-natives-macos.jar    lwjgl-nuklear-natives-macos.jar lwjgl-stb-natives-macos.jar
lwjgl-glfw-natives-macos.jar    lwjgl-openal-natives-macos.jar  lwjgl-vulkan-natives-macos.jar
lwjgl-nanovg-natives-macos.jar  lwjgl-opengl-natives-macos.jar

(downloaded from https://www.lwjgl.org/customize)

CodePudding user response:

You selected the wrong natives in the LWJGL customizer for your CPU architecture. You selected macOS x64, however M1 is not x86 but arm. The current LWJGL release 3.2.3 does not support macOS arm. You have to use the 3.3.0 Early Access version on the LWJGL customizer and then select the macOS arm64 native.

  • Related