-1

I'm using Mac with M1 chip (clang-arm64 compiler).

I'm trying to build a project for using OpenGL. To use it I need GLFW and GLAD libraries. I cannot link the libraries properly. Here's my CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(GameEngine LANGUAGES C CXX OBJC OBJCXX)

# Set the macOS application bundle properties
set(MACOSX_BUNDLE_BUNDLE_NAME "GameEngine")
set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.andriidiachenko.gameengine")
set(MACOSX_BUNDLE_INFO_STRING "GameEngine Application")
set(MACOSX_BUNDLE_LONG_VERSION_STRING "1.0.0")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0")
set(MACOSX_BUNDLE_BUNDLE_VERSION "1.0.0")

# Set the minimum macOS version
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum macOS version")

# Disable console window
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/Info.plist")

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(USE_MACOS_NATIVE_CODE OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglfw -ldl")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lglfw -ldl")

# Version numbers might change in the future check your folder
# names you can go to these folders using command + g and typing
# /opt/homebrew while you are in finder
# include_directories(/opt/homebrew/Cellar/glew/2.2.0_1/include)
# link_directories(/opt/homebrew/Cellar/glew/2.2.0_1/lib)

# add_subdirectory(${CMAKE_SOURCE_DIR}/lib/glfw-3.3.8)
# include_directories(${CMAKE_SOURCE_DIR}/lib/glfw-3.3.8/include)
# link_directories(/opt/homebrew/Cellar/glfw/3.3.8/lib)

# find_package(glfw3 REQUIRED)

add_executable(Engine MACOSX_BUNDLE src/main.cpp lib/glad/src/glad.c)

# Set the minimum macOS version
set_target_properties(Engine PROPERTIES
    BUNDLE True
    MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist"
    MACOSX_BUNDLE_GUI_IDENTIFIER "com.andriidiachenko.gameengine"
    MACOSX_BUNDLE_BUNDLE_NAME "GameEngine"
    MACOSX_BUNDLE_INFO_STRING "GameEngine Application"
    MACOSX_BUNDLE_LONG_VERSION_STRING "1.0.0"
    MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0"
    MACOSX_BUNDLE_BUNDLE_VERSION "1.0.0"
)

# Utils Lib
add_library(UtilsLib SHARED
    src/Utils/AppConfigurationManager.h
    src/Utils/Size.h
    src/Utils/LibraryInfo.h
    src/Utils/OpenGLUtils.h
    src/Utils/ImageProcessor.h
    src/Utils/Filesystem.h
)

set_target_properties(UtilsLib PROPERTIES LINKER_LANGUAGE CXX)

# Helpers Lib
add_library(HelpersLib SHARED
    src/Helpers/Singleton.h
    src/Helpers/SingletonAbstract.h
)

set_target_properties(HelpersLib PROPERTIES LINKER_LANGUAGE CXX)

# WindowBuilder Lib
add_library(WindowBuilderLib SHARED
    src/WindowBuilder/IWindowBuilder.h
)

set_target_properties(WindowBuilderLib PROPERTIES LINKER_LANGUAGE CXX)

if (USE_MACOS_NATIVE_CODE)
    enable_language(OBJC)
    enable_language(OBJCXX)

    target_sources(WindowBuilderLib PUBLIC
        src/WindowBuilder/macOS/WindowBuilderMacOS.h    
        src/WindowBuilder/macOS/WindowBuilderObjCFacade.h
    )

    target_sources(WindowBuilderLib PRIVATE
        src/WindowBuilder/macOS/WindowBuilderMacOS.cpp
        src/WindowBuilder/macOS/WindowBuilderObjCFacade.cpp
    )

    add_library(WindowBuilderObjCLib MODULE
        src/WindowBuilder/macOS/Objective-C/WindowBuilderObjCWrapper.mm
    )

    target_sources(WindowBuilderObjCLib
    PRIVATE
        src/WindowBuilder/macOS/Objective-C/WindowBuilderObjC.h
        src/WindowBuilder/macOS/Objective-C/WindowBuilderObjC.mm
    )

    target_link_libraries(WindowBuilderObjCLib
        PRIVATE "-framework Cocoa"
        PRIVATE "-framework Foundation"
        PRIVATE "-framework AppKit"
    )

    # Set the language for the library to Objective-C++
    set_target_properties(WindowBuilderObjCLib PROPERTIES
        LINKER_LANGUAGE "CXX"
        XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES
        XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES YES
        XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES
    )
else()
    target_sources(UtilsLib PUBLIC
        src/WindowBuilder/glfw/WindowBuilderGlfw.h    
    )

    target_sources(UtilsLib PRIVATE
        src/WindowBuilder/glfw/WindowBuilderGlfw.cpp  
    )
endif()

# Draw Lib
add_library(DrawLib STATIC
    src/Draw/Window/Window.h
)

target_sources(DrawLib PRIVATE
    src/Draw/Window/Window.cpp
)

set_target_properties(DrawLib PROPERTIES LINKER_LANGUAGE CXX)

# Engine Lib
add_library(EngineLib STATIC
    # Root
    src/Engine/GObject.h
    src/Engine/GObject2D.h
    src/Engine/GTexture2D.h
    src/Engine/GObjectPool.h
    src/Engine/GGameLoop.h
    # Shapes
    src/Engine/Shapes/GShape2D.h
    src/Engine/Shapes/GShape3D.h
    src/Engine/Shapes/GTriangle.h
    # Shader Pipeline
    src/Engine/GShaderPipeline.h
)

target_sources(EngineLib PRIVATE
    src/Engine/GObject.cpp
    src/Engine/GTexture2D.cpp
    src/Engine/GGameLoop.cpp
    src/Engine/GShaderPipeline.cpp
    src/Engine/GObjectPool.cpp
)

target_include_directories(EngineLib PUBLIC
    src/Engine/Shaders
)

# Boost
set(BOOST_ROOT lib/boost_1_82_0)

find_package(Boost)

if (Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(Engine ${Boost_LIBRARIES})
endif()

# PugiXML lib
add_subdirectory(${CMAKE_SOURCE_DIR}/lib/pugixml-1.13)

# OpenGL
find_package(OpenGL 3.3 REQUIRED)

# GLAD
# set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -c <TARGET>")
add_library(glad STATIC
    ${CMAKE_SOURCE_DIR}/lib/glad/include/glad/glad.h 
    ${CMAKE_SOURCE_DIR}/lib/glad/src/glad.c 
)
target_include_directories(glad PUBLIC ${CMAKE_SOURCE_DIR}/lib/glad/include)
# include_directories(${CMAKE_SOURCE_DIR}/lib/glad/include)
# target_compile_options(glad PUBLIC "-fno-common")

# set_target_properties(glad PROPERTIES
        # LINKER_LANGUAGE "C"
# )

# add_subdirectory(${CMAKE_SOURCE_DIR}/lib/glad)
include_directories(${CMAKE_SOURCE_DIR}/lib/glad/include)

# GLFW3
find_package(glfw3 REQUIRED)
# include_directories(/opt/homebrew/Cellar/glfw/3.3.8/include)

# add_library(glfw STATIC ${CMAKE_SOURCE_DIR}/lib/glfw-3.3.8/src)
# target_include_directories(glfw PUBLIC ${CMAKE_SOURCE_DIR}/lib/glfw-3.3.8/include)
# add_subdirectory(${CMAKE_SOURCE_DIR}/lib/glfw-3.3.8)
# include_directories(${CMAKE_SOURCE_DIR}/lib/glfw-3.3.8/include)

# set_target_properties(glfw PROPERTIES
#         LINKER_LANGUAGE "OBJC"
# )

# Include source files
include_directories(${CMAKE_SOURCE_DIR}/src)

# Add the stb library
include_directories(${CMAKE_SOURCE_DIR}/lib/stb)

# Link the DrawLib and UtilsLib targets to the Engine target
target_link_libraries(Engine 
    PRIVATE
        glad
        glfw
        EngineLib
        WindowBuilderLib
        DrawLib
        UtilsLib
        HelpersLib
        OpenGL::GL
        pugixml
        "-framework OpenGL"
        "-framework IOKit"
        "-framework Cocoa"
        "-framework Foundation"
        "-framework AppKit"
)

# testing binary
add_executable(Test Tests/Test.cpp)
target_link_libraries(Test 
    PRIVATE
        glad
        glfw
        EngineLib
        WindowBuilderLib
        DrawLib
        UtilsLib
        HelpersLib
        OpenGL::GL
        pugixml
        "-framework OpenGL"
        "-framework IOKit"
        "-framework Cocoa"
        "-framework Foundation"
        "-framework AppKit"
)
# target_sources(Test PRIVATE
#     Tests/MemoryLeak.cpp
# )

# enable testing functionality
enable_testing()

# define tests
add_test(
  NAME Test
  COMMAND $<TARGET_FILE:Test>
)

You can see here I tried to link GLFW with find_package() and target_link_libraries() for brew installed GLFW, I was trying to add_subdirectory() and point to GLFW downloaded (in lib folder), nothing of this worked and it was giving me an error:

[build] Undefined symbols for architecture arm64:
[build]   "_gladLoadGLLoader", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::InitGlad() in WindowBuilderGlfw.cpp.o
[build]   "_glad_glViewport", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::SetViewport(Utils::Metrics::Size) in WindowBuilderGlfw.cpp.o
[build]   "_glfwCreateWindow", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::CreateWindow(Utils::Metrics::Size) in WindowBuilderGlfw.cpp.o
[build]   "_glfwGetProcAddress", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::InitGlad() in WindowBuilderGlfw.cpp.o
[build]   "_glfwInit", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::InitWindow() in WindowBuilderGlfw.cpp.o
[build]   "_glfwMakeContextCurrent", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::CreateWindow(Utils::Metrics::Size) in WindowBuilderGlfw.cpp.o
[build]   "_glfwTerminate", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::~WindowBuilderGlfw() in WindowBuilderGlfw.cpp.o
[build]       WindowBuilder::WindowBuilderGlfw::CreateWindow(Utils::Metrics::Size) in WindowBuilderGlfw.cpp.o
[build]   "_glfwWindowHint", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::InitWindow() in WindowBuilderGlfw.cpp.o
[build] ld: symbol(s) not found for architecture arm64

When I added this line to my CMakeLists.txt, compiler seemed to finally be able to find GLFW library:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglfw -ldl")

However, it also provides this output:

[build] clang: warning: -lglfw: 'linker' input unused [-Wunused-command-line-argument]
[build] clang: warning: -ldl: 'linker' input unused [-Wunused-command-line-argument]

And error message is reduced to GLAD now:

[build] Undefined symbols for architecture arm64:
[build]   "_gladLoadGLLoader", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::InitGlad() in WindowBuilderGlfw.cpp.o
[build]   "_glad_glViewport", referenced from:
[build]       WindowBuilder::WindowBuilderGlfw::SetViewport(Utils::Metrics::Size) in WindowBuilderGlfw.cpp.o

I'm trying to link GLAD by downloading the source files from the website, creating a library from them and then linking it to the main executable.

genpfault
  • 51,148
  • 11
  • 85
  • 139
  • Probably you are using wrong version of library. Probably it is build for Amd64 instead for Arm64 or universal. This `-lglfw: 'linker' input unused` warning indicates that I'm probably right and linker can't find any symbols which could be used for Arm64 target. – Marek R Aug 08 '23 at 10:58

0 Answers0