glfw / glfw

A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input
https://www.glfw.org
zlib License
12.82k stars 5.15k forks source link

Linking issue MacOS Sonoma 14.5 ("OBJC_CLASS$_CAMetalLayer"-Error) #2596

Open akvachan opened 1 month ago

akvachan commented 1 month ago

Full Error:

-- The C compiler identification is AppleClang 15.0.0.15000309 -- The CXX compiler identification is AppleClang 15.0.0.15000309 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done (0.4s) -- Generating done (0.0s) -- Build files have been written to: /Users/arseniikvachan/CRoot/Algorithms/tests/build [ 50%] Building CXX object CMakeFiles/tests.dir/main.cpp.o [100%] Linking CXX executable tests Undefined symbols for architecture arm64: "_OBJCCLASS$_CAMetalLayer", referenced from: in libglfw3.a21 ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[2]: [tests] Error 1 make[1]: [CMakeFiles/tests.dir/all] Error 2 make: *** [all] Error 2

CMakeLists.txt for building the library:

cmake_minimum_required(VERSION 3.30.1)

project(Algorithms)

add_subdirectory(external/glfw)

include_directories(
    lib/include
    PUBLIC external/glfw/include
)

add_library(
    ${PROJECT_NAME}
    lib/cpp/lsearch.cpp 
)

set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER lib/include/lsearch.h)

CMakeLists.txt for linking the library with main.cpp:

cmake_minimum_required(VERSION 3.30.1)

project(Algorithms-Test)

add_executable(tests main.cpp)

target_include_directories(
    tests
    PRIVATE ${CMAKE_SOURCE_DIR}/../lib/include/
    PRIVATE ${CMAKE_SOURCE_DIR}/../external/glfw/include/
)

target_link_directories(
    tests 
    PRIVATE ${CMAKE_SOURCE_DIR}/../build/
    PRIVATE ${CMAKE_SOURCE_DIR}/../build/external/glfw/src
)

target_link_libraries(
    tests 
    Algorithms
    glfw3
    "-framework Cocoa"
    "-framework OpenGL"
    "-framework IOKit"
)

Building is successfull, but linking failes. Here is a building log jic:

Removing previous build... Building library... -- The C compiler identification is AppleClang 15.0.0.15000309 -- The CXX compiler identification is AppleClang 15.0.0.15000309 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped Removing previous build... Building library... -- The C compiler identification is AppleClang 15.0.0.15000309 -- The CXX compiler identification is AppleClang 15.0.0.15000309 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped Removing previous build... Building library... -- The C compiler identification is AppleClang 15.0.0.15000309 -- The CXX compiler identification is AppleClang 15.0.0.15000309 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success -- Found Threads: TRUE -- Including Cocoa support -- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) -- Documentation generation requires Doxygen 1.9.8 or later -- Configuring done (0.5s) -- Generating done (0.0s) -- Build files have been written to: /Users/arseniikvachan/CRoot/Algorithms/build [ 4%] Building CXX object CMakeFiles/Algorithms.dir/lib/cpp/lsearch.cpp.o [ 8%] Linking CXX static library libAlgorithms.a [ 8%] Built target Algorithms [ 12%] Building C object external/glfw/src/CMakeFiles/glfw.dir/context.c.o [ 16%] Building C object external/glfw/src/CMakeFiles/glfw.dir/init.c.o [ 20%] Building C object external/glfw/src/CMakeFiles/glfw.dir/input.c.o [ 25%] Building C object external/glfw/src/CMakeFiles/glfw.dir/monitor.c.o [ 29%] Building C object external/glfw/src/CMakeFiles/glfw.dir/platform.c.o [ 33%] Building C object external/glfw/src/CMakeFiles/glfw.dir/vulkan.c.o [ 37%] Building C object external/glfw/src/CMakeFiles/glfw.dir/window.c.o [ 41%] Building C object external/glfw/src/CMakeFiles/glfw.dir/egl_context.c.o [ 45%] Building C object external/glfw/src/CMakeFiles/glfw.dir/osmesa_context.c.o [ 50%] Building C object external/glfw/src/CMakeFiles/glfw.dir/null_init.c.o [ 54%] Building C object external/glfw/src/CMakeFiles/glfw.dir/null_monitor.c.o [ 58%] Building C object external/glfw/src/CMakeFiles/glfw.dir/null_window.c.o [ 62%] Building C object external/glfw/src/CMakeFiles/glfw.dir/null_joystick.c.o [ 66%] Building C object external/glfw/src/CMakeFiles/glfw.dir/cocoa_time.c.o [ 70%] Building C object external/glfw/src/CMakeFiles/glfw.dir/posix_module.c.o [ 75%] Building C object external/glfw/src/CMakeFiles/glfw.dir/posix_thread.c.o [ 79%] Building C object external/glfw/src/CMakeFiles/glfw.dir/cocoa_init.m.o [ 83%] Building C object external/glfw/src/CMakeFiles/glfw.dir/cocoa_joystick.m.o [ 87%] Building C object external/glfw/src/CMakeFiles/glfw.dir/cocoa_monitor.m.o [ 91%] Building C object external/glfw/src/CMakeFiles/glfw.dir/cocoa_window.m.o [ 95%] Building C object external/glfw/src/CMakeFiles/glfw.dir/nsgl_context.m.o [100%] Linking C static library libglfw3.a [100%] Built target glfw

akvachan commented 1 month ago

More information:

  1. Cloned glfw into PROJECT_ROOT/external/ via git submodules
  2. Build the glfw as described in CMakeLists.txt for building the library
  3. I have a dedicated subproject for tests that has a main.cpp file and its own CMakeLists.txt
  4. The original code that should be compiled:
#include "../lib/include/lsearch.h"
#include <GLFW/glfw3.h>
#include <iostream>

int main() {

    int arr[4] = {1, 2, 3, 4};
    int target = 3; 
    int result = akvachan::lsearch(target, arr, 4);

    GLFWwindow* window;
    int width, height;

    if( !glfwInit() )
    {
        fprintf( stderr, "Failed to initialize GLFW\n" );
        exit( EXIT_FAILURE );
    }

    window = glfwCreateWindow( 300, 300, "Gears", NULL, NULL );

    // Main loop
    while( !glfwWindowShouldClose(window) )
    {
        //// draw gears 
        //draw();
        //// update animation
        //animate();

        // swap buffers
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // Terminate GLFW
    glfwTerminate();
    std::cout << result << std::endl; 

    return 0;

}