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.