I am working on a project and when I try to compile it I get the following error:
/usr/bin/ld: external/BlueBerry/libBlueBerryGameEngine.a(windows.cpp.o):(.bss+0x0): multiple definition of `BlueBerry::main_window'; external/BlueBerry/libBlueBerryGameEngine.a(BlueBerry.cpp.o):(.bss+0x0): first defined here
However, I have only declared the variable BlueBerry::main_window once in a header. All my headers have header guards (#pragma once) so I don't understand how I could be including it twice.
I know all the code works because when I put it in the same file it runs fine.
I am building the project with cmake and compliling it with make and gcc.
Any help would be greatly appreciated as I am new to cmake.
Here is all my code:
BlueBerry.h
#pragma once
namespace BlueBerry
{
void init();
}
BlueBerry.cpp
#include <vulkan/vulkan.h>
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
#include "pch.h"
#include "windows.h"
namespace BlueBerry
{
void init()
{
int status = 0;
status = BlueBerry::initialise_window();
status = BlueBerry::handle_inputs();
}
}
windows.h
#pragma once
namespace BlueBerry
{
void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);
void glfw_mouse_pos_callback(GLFWwindow* window, double xpos, double ypos);
void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods);
void glfw_mouse_scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
void glfw_drag_drop_callback(GLFWwindow* window, int count, const char** paths);
int initialise_window();
int handle_inputs();
GLFWwindow* main_window;
}
windows.cpp
#include "windows.h"
#include "keys.h"
namespace BlueBerry
{
void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
std::cout << "key: " << KEYBOARD_KEY_TO_STRING(key) << (action == 1 ? " pressed" : " released") << std::endl;
}
void glfw_mouse_pos_callback(GLFWwindow* window, double xpos, double ypos)
{
std::cout << "mouse pos: (" << xpos << ", " << ypos << ")" << std::endl;
}
void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{
std::cout << "mouse button: " << MOUSE_BUTTON_TO_STRING(button) << " " << (action == 1 ? " pressed" : " released") << std::endl;
}
void glfw_mouse_scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{
std::cout << xoffset << " " << yoffset << std::endl;
}
void glfw_drag_drop_callback(GLFWwindow* window, int count, const char** paths)
{
for(int i = 0; i < count; i++)
{
std::cout << paths[i] << std::endl;
}
}
int initialise_window()
{
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
main_window = glfwCreateWindow(800, 600, "Blue Berry game engine test", nullptr, nullptr);
glfwSetKeyCallback(main_window, glfw_key_callback);
glfwSetCursorPosCallback(main_window, glfw_mouse_pos_callback);
glfwSetMouseButtonCallback(main_window, glfw_mouse_button_callback);
glfwSetScrollCallback(main_window, glfw_mouse_scroll_callback);
glfwSetDropCallback(main_window, glfw_drag_drop_callback);
return 0;
}
int handle_inputs()
{
while(!glfwWindowShouldClose(main_window))
{
glfwWaitEvents();
//glfwPollEvents();
}
glfwTerminate();
return 0;
}
}
pch.h
#pragma once
#include <iostream>
#include <fstream>
#include <math.h>
#include <string>
#include <cstring>
#include <memory>
#include <array>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <stdexcept>
#include <cstdlib>
#include <cstdint>
#include <optional>
#include <chrono>
#include <thread>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <future>
keys.h
#pragma once
//from GLFW3.h keys
#define BB_KEY_UNKNOWN -1
#define BB_KEY_SPACE 32
#define BB_KEY_APOSTROPHE 39
#define BB_KEY_COMMA 44
#define BB_KEY_MINUS 45
#define BB_KEY_PERIOD 46
#define BB_KEY_SLASH 47
#define BB_KEY_0 48
#define BB_KEY_1 49
#define BB_KEY_2 50
#define BB_KEY_3 51
#define BB_KEY_4 52
#define BB_KEY_5 53
#define BB_KEY_6 54
#define BB_KEY_7 55
#define BB_KEY_8 56
#define BB_KEY_9 57
#define BB_KEY_SEMICOLON 59
#define BB_KEY_EQUAL 61
#define BB_KEY_A 65
#define BB_KEY_B 66
#define BB_KEY_C 67
#define BB_KEY_D 68
#define BB_KEY_E 69
#define BB_KEY_F 70
#define BB_KEY_G 71
#define BB_KEY_H 72
#define BB_KEY_I 73
#define BB_KEY_J 74
#define BB_KEY_K 75
#define BB_KEY_L 76
#define BB_KEY_M 77
#define BB_KEY_N 78
#define BB_KEY_O 79
#define BB_KEY_P 80
#define BB_KEY_Q 81
#define BB_KEY_R 82
#define BB_KEY_S 83
#define BB_KEY_T 84
#define BB_KEY_U 85
#define BB_KEY_V 86
#define BB_KEY_W 87
#define BB_KEY_X 88
#define BB_KEY_Y 89
#define BB_KEY_Z 90
#define BB_KEY_LEFT_BRACKET 91
#define BB_KEY_BACKSLASH 92
#define BB_KEY_RIGHT_BRACKET 93
#define BB_KEY_GRAVE_ACCENT 96
#define BB_KEY_WORLD_1 161
#define BB_KEY_WORLD_2 162
#define BB_KEY_ESCAPE 256
#define BB_KEY_ENTER 257
#define BB_KEY_TAB 258
#define BB_KEY_BACKSPACE 259
#define BB_KEY_INSERT 260
#define BB_KEY_DELETE 261
#define BB_KEY_RIGHT 262
#define BB_KEY_LEFT 263
#define BB_KEY_DOWN 264
#define BB_KEY_UP 265
#define BB_KEY_PAGE_UP 266
#define BB_KEY_PAGE_DOWN 267
#define BB_KEY_HOME 268
#define BB_KEY_END 269
#define BB_KEY_CAPS_LOCK 280
#define BB_KEY_SCROLL_LOCK 281
#define BB_KEY_NUM_LOCK 282
#define BB_KEY_PRINT_SCREEN 283
#define BB_KEY_PAUSE 284
#define BB_KEY_F1 290
#define BB_KEY_F2 291
#define BB_KEY_F3 292
#define BB_KEY_F4 293
#define BB_KEY_F5 294
#define BB_KEY_F6 295
#define BB_KEY_F7 296
#define BB_KEY_F8 297
#define BB_KEY_F9 298
#define BB_KEY_F10 299
#define BB_KEY_F11 300
#define BB_KEY_F12 301
#define BB_KEY_F13 302
#define BB_KEY_F14 303
#define BB_KEY_F15 304
#define BB_KEY_F16 305
#define BB_KEY_F17 306
#define BB_KEY_F18 307
#define BB_KEY_F19 308
#define BB_KEY_F20 309
#define BB_KEY_F21 310
#define BB_KEY_F22 311
#define BB_KEY_F23 312
#define BB_KEY_F24 313
#define BB_KEY_F25 314
#define BB_KEY_KP_0 320
#define BB_KEY_KP_1 321
#define BB_KEY_KP_2 322
#define BB_KEY_KP_3 323
#define BB_KEY_KP_4 324
#define BB_KEY_KP_5 325
#define BB_KEY_KP_6 326
#define BB_KEY_KP_7 327
#define BB_KEY_KP_8 328
#define BB_KEY_KP_9 329
#define BB_KEY_KP_DECIMAL 330
#define BB_KEY_KP_DIVIDE 331
#define BB_KEY_KP_MULTIPLY 332
#define BB_KEY_KP_SUBTRACT 333
#define BB_KEY_KP_ADD 334
#define BB_KEY_KP_ENTER 335
#define BB_KEY_KP_EQUAL 336
#define BB_KEY_LEFT_SHIFT 340
#define BB_KEY_LEFT_CONTROL 341
#define BB_KEY_LEFT_ALT 342
#define BB_KEY_LEFT_SUPER 343
#define BB_KEY_RIGHT_SHIFT 344
#define BB_KEY_RIGHT_CONTROL 345
#define BB_KEY_RIGHT_ALT 346
#define BB_KEY_RIGHT_SUPER 347
#define BB_KEY_MENU 348
#define BB_KEY_LAST BB_KEY_MENU
#define BB_MOD_SHIFT 0x0001
#define BB_MOD_CONTROL 0x0002
#define BB_MOD_ALT 0x0004
#define BB_MOD_SUPER 0x0008
#define BB_MOD_CAPS_LOCK 0x0010
#define BB_MOD_NUM_LOCK 0x0020
#define BB_MOUSE_BUTTON_1 0
#define BB_MOUSE_BUTTON_2 1
#define BB_MOUSE_BUTTON_3 2
#define BB_MOUSE_BUTTON_4 3
#define BB_MOUSE_BUTTON_5 4
#define BB_MOUSE_BUTTON_6 5
#define BB_MOUSE_BUTTON_7 6
#define BB_MOUSE_BUTTON_8 7
#define BB_MOUSE_BUTTON_LAST BB_MOUSE_BUTTON_8
#define BB_MOUSE_BUTTON_LEFT BB_MOUSE_BUTTON_1
#define BB_MOUSE_BUTTON_RIGHT BB_MOUSE_BUTTON_2
#define BB_MOUSE_BUTTON_MIDDLE BB_MOUSE_BUTTON_3
#define BB_JOYSTICK_1 0
#define BB_JOYSTICK_2 1
#define BB_JOYSTICK_3 2
#define BB_JOYSTICK_4 3
#define BB_JOYSTICK_5 4
#define BB_JOYSTICK_6 5
#define BB_JOYSTICK_7 6
#define BB_JOYSTICK_8 7
#define BB_JOYSTICK_9 8
#define BB_JOYSTICK_10 9
#define BB_JOYSTICK_11 10
#define BB_JOYSTICK_12 11
#define BB_JOYSTICK_13 12
#define BB_JOYSTICK_14 13
#define BB_JOYSTICK_15 14
#define BB_JOYSTICK_16 15
#define BB_JOYSTICK_LAST BB_JOYSTICK_16
#define BB_GAMEPAD_BUTTON_A 0
#define BB_GAMEPAD_BUTTON_B 1
#define BB_GAMEPAD_BUTTON_X 2
#define BB_GAMEPAD_BUTTON_Y 3
#define BB_GAMEPAD_BUTTON_LEFT_BUMPER 4
#define BB_GAMEPAD_BUTTON_RIGHT_BUMPER 5
#define BB_GAMEPAD_BUTTON_BACK 6
#define BB_GAMEPAD_BUTTON_START 7
#define BB_GAMEPAD_BUTTON_GUIDE 8
#define BB_GAMEPAD_BUTTON_LEFT_THUMB 9
#define BB_GAMEPAD_BUTTON_RIGHT_THUMB 10
#define BB_GAMEPAD_BUTTON_DPAD_UP 11
#define BB_GAMEPAD_BUTTON_DPAD_RIGHT 12
#define BB_GAMEPAD_BUTTON_DPAD_DOWN 13
#define BB_GAMEPAD_BUTTON_DPAD_LEFT 14
#define BB_GAMEPAD_BUTTON_LAST BB_GAMEPAD_BUTTON_DPAD_LEFT
#define BB_GAMEPAD_BUTTON_CROSS BB_GAMEPAD_BUTTON_A
#define BB_GAMEPAD_BUTTON_CIRCLE BB_GAMEPAD_BUTTON_B
#define BB_GAMEPAD_BUTTON_SQUARE BB_GAMEPAD_BUTTON_X
#define BB_GAMEPAD_BUTTON_TRIANGLE BB_GAMEPAD_BUTTON_Y
#define BB_GAMEPAD_AXIS_LEFT_X 0
#define BB_GAMEPAD_AXIS_LEFT_Y 1
#define BB_GAMEPAD_AXIS_RIGHT_X 2
#define BB_GAMEPAD_AXIS_RIGHT_Y 3
#define BB_GAMEPAD_AXIS_LEFT_TRIGGER 4
#define BB_GAMEPAD_AXIS_RIGHT_TRIGGER 5
#define BB_GAMEPAD_AXIS_LAST BB_GAMEPAD_AXIS_RIGHT_TRIGGER
std::string KEYBOARD_KEY_TO_STRING(int key)
{
if(key == -1) { return "UNKNOWN"; }
if(key == 32) { return "SPACE"; }
if(key == 39) { return "APOSTROPHE"; }
if(key == 44) { return "COMMA"; }
if(key == 45) { return "MINUS"; }
if(key == 46) { return "PERIOD"; }
if(key == 47) { return "SLASH"; }
if(key == 48) { return "0"; }
if(key == 49) { return "1"; }
if(key == 50) { return "2"; }
if(key == 51) { return "3"; }
if(key == 52) { return "4"; }
if(key == 53) { return "5"; }
if(key == 54) { return "6"; }
if(key == 55) { return "7"; }
if(key == 56) { return "8"; }
if(key == 57) { return "9"; }
if(key == 59) { return "SEMICOLON"; }
if(key == 61) { return "EQUAL"; }
if(key == 65) { return "A"; }
if(key == 66) { return "B"; }
if(key == 67) { return "C"; }
if(key == 68) { return "D"; }
if(key == 69) { return "E"; }
if(key == 70) { return "F"; }
if(key == 71) { return "G"; }
if(key == 72) { return "H"; }
if(key == 73) { return "I"; }
if(key == 74) { return "J"; }
if(key == 75) { return "K"; }
if(key == 76) { return "L"; }
if(key == 77) { return "M"; }
if(key == 78) { return "N"; }
if(key == 79) { return "O"; }
if(key == 80) { return "P"; }
if(key == 81) { return "Q"; }
if(key == 82) { return "R"; }
if(key == 83) { return "S"; }
if(key == 84) { return "T"; }
if(key == 85) { return "U"; }
if(key == 86) { return "V"; }
if(key == 87) { return "W"; }
if(key == 88) { return "X"; }
if(key == 89) { return "Y"; }
if(key == 90) { return "Z"; }
if(key == 91) { return "LEFT_BRACKET"; }
if(key == 92) { return "BACKSLASH"; }
if(key == 93) { return "RIGHT_BRACKET"; }
if(key == 96) { return "GRAVE_ACCENT"; }
if(key == 161) { return "WORLD_1"; }
if(key == 162) { return "WORLD_2"; }
if(key == 256) { return "ESCAPE"; }
if(key == 257) { return "ENTER"; }
if(key == 258) { return "TAB"; }
if(key == 259) { return "BACKSPACE"; }
if(key == 260) { return "INSERT"; }
if(key == 261) { return "DELETE"; }
if(key == 262) { return "RIGHT"; }
if(key == 263) { return "LEFT"; }
if(key == 264) { return "DOWN"; }
if(key == 265) { return "UP"; }
if(key == 266) { return "PAGE_UP"; }
if(key == 267) { return "PAGE_DOWN"; }
if(key == 268) { return "HOME"; }
if(key == 269) { return "END"; }
if(key == 280) { return "CAPS_LOCK"; }
if(key == 281) { return "SCROLL_LOCK"; }
if(key == 282) { return "NUM_LOCK"; }
if(key == 283) { return "PRINT_SCREEN"; }
if(key == 284) { return "PAUSE"; }
if(key == 290) { return "F1"; }
if(key == 291) { return "F2"; }
if(key == 292) { return "F3"; }
if(key == 293) { return "F4"; }
if(key == 294) { return "F5"; }
if(key == 295) { return "F6"; }
if(key == 296) { return "F7"; }
if(key == 297) { return "F8"; }
if(key == 298) { return "F9"; }
if(key == 299) { return "F10"; }
if(key == 300) { return "F11"; }
if(key == 301) { return "F12"; }
if(key == 302) { return "F13"; }
if(key == 303) { return "F14"; }
if(key == 304) { return "F15"; }
if(key == 305) { return "F16"; }
if(key == 306) { return "F17"; }
if(key == 307) { return "F18"; }
if(key == 308) { return "F19"; }
if(key == 309) { return "F20"; }
if(key == 310) { return "F21"; }
if(key == 311) { return "F22"; }
if(key == 312) { return "F23"; }
if(key == 313) { return "F24"; }
if(key == 314) { return "F25"; }
if(key == 320) { return "KP_0"; }
if(key == 321) { return "KP_1"; }
if(key == 322) { return "KP_2"; }
if(key == 323) { return "KP_3"; }
if(key == 324) { return "KP_4"; }
if(key == 325) { return "KP_5"; }
if(key == 326) { return "KP_6"; }
if(key == 327) { return "KP_7"; }
if(key == 328) { return "KP_8"; }
if(key == 329) { return "KP_9"; }
if(key == 330) { return "KP_DECIMAL"; }
if(key == 331) { return "KP_DIVIDE"; }
if(key == 332) { return "KP_MULTIPLY"; }
if(key == 333) { return "KP_SUBTRACT"; }
if(key == 334) { return "KP_ADD"; }
if(key == 335) { return "KP_ENTER"; }
if(key == 336) { return "KP_EQUAL"; }
if(key == 340) { return "LEFT_SHIFT"; }
if(key == 341) { return "LEFT_CONTROL"; }
if(key == 342) { return "LEFT_ALT"; }
if(key == 343) { return "LEFT_SUPER"; }
if(key == 344) { return "RIGHT_SHIFT"; }
if(key == 345) { return "RIGHT_CONTROL"; }
if(key == 346) { return "RIGHT_ALT"; }
if(key == 347) { return "RIGHT_SUPER"; }
if(key == 348) { return "MENU"; }
if(key == BB_KEY_MENU) { return "LAST"; }
if(key == 0x0001) { return "SHIFT"; }
if(key == 0x0002) { return "CONTROL"; }
if(key == 0x0004) { return "ALT"; }
if(key == 0x0008) { return "SUPER"; }
if(key == 0x0010) { return "CAPS_LOCK"; }
if(key == 0x0020) { return "NUM_LOCK"; }
return "Error: no key found";
}
std::string MOUSE_BUTTON_TO_STRING(int key)
{
if(key == BB_MOUSE_BUTTON_8) { return "MOUSE_LAST"; }
if(key == BB_MOUSE_BUTTON_1) { return "MOUSE_LEFT"; }
if(key == BB_MOUSE_BUTTON_2) { return "MOUSE_RIGHT"; }
if(key == BB_MOUSE_BUTTON_3) { return "MOUSE_MIDDLE"; }
if(key == 0) { return "MOUSE_1"; }
if(key == 1) { return "MOUSE_2"; }
if(key == 2) { return "MOUSE_3"; }
if(key == 3) { return "MOUSE_4"; }
if(key == 4) { return "MOUSE_5"; }
if(key == 5) { return "MOUSE_6"; }
if(key == 6) { return "MOUSE_7"; }
if(key == 7) { return "MOUSE_8"; }
return "Error: no key found";
}
std::string JOYSTICK_TO_STRING(int key)
{
if(key == 0) { return "JOYSTICK_1"; }
if(key == 1) { return "JOYSTICK_2"; }
if(key == 2) { return "JOYSTICK_3"; }
if(key == 3) { return "JOYSTICK_4"; }
if(key == 4) { return "JOYSTICK_5"; }
if(key == 5) { return "JOYSTICK_6"; }
if(key == 6) { return "JOYSTICK_7"; }
if(key == 7) { return "JOYSTICK_8"; }
if(key == 8) { return "JOYSTICK_9"; }
if(key == 9) { return "JOYSTICK_10"; }
if(key == 10) { return "JOYSTICK_11"; }
if(key == 11) { return "JOYSTICK_12"; }
if(key == 12) { return "JOYSTICK_13"; }
if(key == 13) { return "JOYSTICK_14"; }
if(key == 14) { return "JOYSTICK_15"; }
if(key == 15) { return "JOYSTICK_16"; }
if(key == BB_JOYSTICK_16) { return "JOYSTICK_LAST"; }
return "Error: no key found";
}
std::string GAMEPAD_BUTTON_TO_STRING(int key)
{
if(key == 0) { return "GAMEPAD_A"; }
if(key == 1) { return "GAMEPAD_B"; }
if(key == 2) { return "GAMEPAD_X"; }
if(key == 3) { return "GAMEPAD_Y"; }
if(key == 4) { return "GAMEPAD_LEFT_BUMPER"; }
if(key == 5) { return "GAMEPAD_RIGHT_BUMPER"; }
if(key == 6) { return "GAMEPAD_BACK"; }
if(key == 7) { return "GAMEPAD_START"; }
if(key == 8) { return "GAMEPAD_GUIDE"; }
if(key == 9) { return "GAMEPAD_LEFT_THUMB"; }
if(key == 10) { return "GAMEPAD_RIGHT_THUMB"; }
if(key == 11) { return "GAMEPAD_DPAD_UP"; }
if(key == 12) { return "GAMEPAD_DPAD_RIGHT"; }
if(key == 13) { return "GAMEPAD_DPAD_DOWN"; }
if(key == 14) { return "GAMEPAD_DPAD_LEFT"; }
if(key == BB_GAMEPAD_BUTTON_DPAD_LEFT) { return "GAMEPAD_LAST"; }
if(key == BB_GAMEPAD_BUTTON_A) { return "GAMEPAD_CROSS"; }
if(key == BB_GAMEPAD_BUTTON_B) { return "GAMEPAD_CIRCLE"; }
if(key == BB_GAMEPAD_BUTTON_X) { return "GAMEPAD_SQUARE"; }
if(key == BB_GAMEPAD_BUTTON_Y) { return "GAMEPAD_TRIANGLE"; }
return "Error: no key found";
}
std::string GAMEPAD_AXIS_TO_STRING(int key)
{
if(key == 0) { return "GAMEPAD_AXIS_LEFT_X"; }
if(key == 1) { return "GAMEPAD_AXIS_LEFT_Y"; }
if(key == 2) { return "GAMEPAD_AXIS_RIGHT_X"; }
if(key == 3) { return "GAMEPAD_AXIS_RIGHT_Y"; }
if(key == 4) { return "GAMEPAD_AXIS_LEFT_TRIGGER"; }
if(key == 5) { return "GAMEPAD_AXIS_RIGHT_TRIGGER"; }
if(key == BB_GAMEPAD_AXIS_RIGHT_TRIGGER) { return "GAMEPAD_AXIS_LAST"; }
return "Error: no key found";
}
CMakelists.txt
#-------------------------------------------------------------------------------------------------------
# main code
#-------------------------------------------------------------------------------------------------------
set(BBsources
src/BlueBerry.cpp
src/windows.cpp
src/pch.h
)
set(BBheaders
include/BlueBerry.h
include/keys.h
include/windows.h
)
add_library(BlueBerryGameEngine STATIC ${BBsources} ${BBheaders})
target_include_directories(BlueBerryGameEngine PRIVATE src/)
target_include_directories(BlueBerryGameEngine PRIVATE include/)
#-------------------------------------------------------------------------------------------------------
# requirements
#-------------------------------------------------------------------------------------------------------
target_compile_features(BlueBerryGameEngine PRIVATE cxx_alignas)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_alignof)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_auto_type)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_constexpr)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_func_identifier)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_long_long_type)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_nullptr)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_sizeof_member)
target_compile_features(BlueBerryGameEngine PRIVATE cxx_strong_enums)
#-------------------------------------------------------------------------------------------------------
# libraries
#-------------------------------------------------------------------------------------------------------
#vulkan
target_include_directories(BlueBerryGameEngine PUBLIC external/vulkan/vulkansdk-linux-x86_64-1.2.135.0/1.2.135.0/x86_64/include)
target_include_directories(BlueBerryGameEngine PUBLIC external/vulkan/vulkansdk-linux-x86_64-1.2.135.0/1.2.135.0/x86_64/lib)
#GLFW
#https://www.glfw.org/docs/3.3/build_guide.html#build_link_cmake_source
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(external/glfw)
target_link_libraries(BlueBerryGameEngine glfw)
#find_package(OpenGL REQUIRED)
#target_link_libraries(${PROJECT_NAME} OpenGL::GL)
#GLM
add_subdirectory(external/glm)
target_link_libraries(BlueBerryGameEngine glm)
#STB
target_include_directories(BlueBerryGameEngine PUBLIC external/stb)
#-------------------------------------------------------------------------------------------------------
# pch
#-------------------------------------------------------------------------------------------------------
#pch
target_precompile_headers(BlueBerryGameEngine
PRIVATE external/vulkan/vulkansdk-linux-x86_64-1.2.135.0/1.2.135.0/x86_64/include/vulkan/vulkan.h
PRIVATE external/glfw/include/GLFW/glfw3.h
PRIVATE external/glm/glm/glm.hpp
PUBLIC external/stb/stb_image.h
PUBLIC external/stb/stb_sprintf.h
PRIVATE src/pch.h
)
#TODO
#build modes