Не получается подключить библиотеку c++ CMake
Мне нужна библиотека glfw. Я работаю в clion, а он вроде не умеет подключать библиотеки сам, так что нужно вручную писать файлы cmake. Я ни разу с ним не работал. Посмотрел в интернете как это делается, и как не странно, ничего не получается. Что только я не пробовал - всегда ошибка. На скриншоте снизу видно структуру проекта, CMakeLists.txt файл и консоль cmake с ошибками. Что я делаю не так? Что нужно исправить?
Вот код текстом кому нужно
project(VoxelEngine)
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 17)
add_executable(VoxelEngine main.cpp)
find_package(OpenGL REQUIRED)
set(GLFW_DIR "../Libraries/glfw-3.3.4.bin.WIN64")
include_directories( "${GLFW_DIR}/include")
find_library(glfw NAMES glfw3 PATHS "${GLFW_DIR}/lib-vc2017" REQUIRED)
target_link_libraries( VoxelEngine ${glfw} opengl32)
Что касается CLion, мне очень нравятся IDE от JetBrains, как то не хочется переходить на что-либо другое. Но пока что проблем с местным CMake не возникает, вроде всё линкуется. Но если трудности возникнут, придётся поменять IDE
Ошибки сборки:
-- Configuring done
-- Generating done
-- Build files have been written to:
C:/Users/Maksim/CLionProjects/VoxelEngine/src/cmake-build-debug
Scanning dependencies of target VoxelEngine
[ 50%] Building CXX object CMakeFiles/VoxelEngine.dir/main.cpp.obj
[100%] Linking CXX executable VoxelEngine.exe
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
Warning: corrupt .drectve at end of def file
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/init.obj):(.text$mn+0x73): undefined
reference to `__imp___stdio_common_vsprintf'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/init.obj):(.text$mn+0x327): undefined
reference to `__security_check_cookie'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/init.obj):
(.xdata[$unwind$_glfwInputError]+0xc): undefined reference to
`__GSHandlerCheck'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x196):
undefined reference to `__security_check_cookie'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x82):
undefined reference to `__security_check_cookie'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x91):
undefined reference to `__security_check_cookie'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/win32_monitor.obj):(.text$mn+0x9b):
undefined reference to `__security_check_cookie'
<.....>
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/egl_context.obj):(.text$mn+0x534):
undefined reference to `__security_check_cookie'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/osmesa_context.obj):(.text$mn+0x1cd):
undefined reference to `__security_check_cookie'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/osmesa_context.obj):
(.xdata[$unwind$_glfwInitOSMesa]+0xc): undefined reference to
`__GSHandlerCheck'
C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-3.3.4.bin.WIN64/lib-
vc2019/glfw3.lib(glfw.dir/Release/osmesa_context.obj):
(.xdata[$unwind$_glfwCreateContextOSMesa]+0x10): undefined reference to
`__GSHandlerCheck'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\VoxelEngine.dir\build.make:106:
VoxelEngine.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:94:
CMakeFiles/VoxelEngine.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:101:
CMakeFiles/VoxelEngine.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:136: VoxelEngine] Error 2
ошибки сборки, если удалить lib-vc2019:
"C:\Program Files\JetBrains\CLion 2021.1\bin\cmake\win\bin\cmake.exe" --build
C:\Users\Maksim\CLionProjects\VoxelEngine\src\cmake-build-debug --target
VoxelEngine -- -j 9
mingw32-make.exe[3]: *** No rule to make target
'C:/Users/Maksim/CLionProjects/VoxelEngine/Libraries/glfw-
3.3.4.bin.WIN64/lib-vc2019/glfw3.lib', needed by 'VoxelEngine.exe'. Stop.
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:94:
CMakeFiles/VoxelEngine.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:101:
CMakeFiles/VoxelEngine.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:136: VoxelEngine] Error 2
Ответы (1 шт):
Посмотрел и понял, что в стандартной поставке под винду нет cmake файла для glfw. Пришлось набросать самому. В нем комментарии, так что справитесь - нужно только в одном месте поправить
project(VoxelEngine)
# не нужно использовать старую версию, хотя бы 3
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 17)
add_executable(VoxelEngine main.cpp)
# нам нужен OpenGL.
find_package(OpenGL REQUIRED)
# это каталог, в который Вы распаковали архив
# его Вы задаете сами! Подозреваю, что возможно, Вам нужно будет просто
# "./" или что то подобное - у Вас ведь оно прям в папку с проектом распаковано
set(GLFW_DIR "../libs/glfw-3.3.2.bin.WIN64")
# в нем должна быть папка include, мы ее добавим
include_directories( "${GLFW_DIR}/include")
# а эта строка поищет собственно lib файл. Возможно, Вам нужно будет тут уточнить путь/имя.
# В каталоге должен быть файл glfw3.lib или что то подобное - glfw3.a
# переменная glfw теперь хранит путь к этому файлу
find_library(glfw NAMES glfw3 PATHS "${GLFW_DIR}/lib-vc2019" REQUIRED)
target_link_libraries( VoxelEngine ${glfw} opengl32)
И забудьте на время о clion - он несет с собой какую то странную версию cmake, с ней бывают непонятности. Плюс он мешает осваивать вначале.
Если не будет линковаться - возможно, в каталоге Libs лежат не подходящие файлы. Тут уже нужно уточнять компилятор и качать по нему.