Я пытался настроить GLFW для запуска проекта OpenGL, но продолжает появляться ошибка, которую я не могу решить, что бы я ни пытался. Важной частью сообщения об ошибке является следующее:
CMake Error at CMakeLists.txt:12 (find_package):
Could not find a configuration file for package "glfw3" that is compatible
with requested version "3.3.2".
The following configuration files were considered but not accepted:
C:/Users/../GLFW/lib/cmake/glfw3/glfw3Config.cmake, version: 3.3.2 (32bit)
Мой CMakeLists.txt выглядит так:
set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/Dependencies/GLFW/lib/cmake/glfw3")
add_executable(1_Intro main.cpp)
include_directories(Dependencies/GLFW/include/GLFW/)
find_package(glfw3 3.3.2 CONFIG REQUIRED)
target_link_libraries(1_Intro ${GLFW})
и все необходимые файлы GLFW можно найти в папке моего проекта следующим образом:
GLFW
|- include
| |- GLFW
| | - glfw3.h
| | - glfw3native.h
|- lib
|- cmake
|- glfw3
|- glfw3Config.cmake
|- glfw3ConfigVersion.cmake
|- glfw3Targets.cmake
|- glfw3Targets-noconfig.cmake
|- pkgconfig
|- glfw3.pc
|- libglfw3.a
Что я сделал для сборки библиотеки, так это загрузил исходный код, затем использовал cmake -G "MinGW Makefiles"
, поскольку я использую компилятор MinGW-w64 GCC, затем mingw32-make
и mingw32-make install
. Затем я скопировал файлы сборки в папку, как показано выше.
После поиска решения я обнаружил, что проблема может быть связана с разницей в архитектуре сборки, используемой библиотекой и компилятором (здесь и здесь). Я использую компилятор MinGW-w64 и предпочел бы придерживаться его, поэтому я попытался изменить сборку CMake. Однако я столкнулся с другой проблемой: я не могу изменить спецификации платформы «MinGW Makefiles» с помощью таких параметров, как -DCMAKE_GENERATOR_PLATFORM
. Я попытался изменить цепочку инструментов, но это тоже не сработало; кажется, что единственным решением является использование 64-битной цепочки инструментов Visual Studio, но это не то, что я хочу.
Есть ли способ изменить мою сборку CMake таким образом, чтобы это была архитектура x64? Или установить мой компилятор на x86 (если это вообще имеет смысл), чтобы он соответствовал версии «glfw3Config.cmake»? Я открыт для других решений, пока я могу сохранить структуру проекта и компилятор такими, какие они есть.
Так я понял в чем проблема. У меня на компьютере были и MinGW-w64 , и MinGW, и оба их bin
пути к каталогам в PATH. Например, при запуске where gcc
последний bin
путь показывался, а не первый. Поэтому я удалил пути MinGW из PATH, перезагрузил компьютер, пересобрал и перекомпилировал, как объяснялось ранее, и теперь все работает.
Однако я делаю это как ответ, чтобы объяснить шаги, которые я предпринял для установки GLFW, что было чем-то вроде кошмара и где я столкнулся со многими проблемами до описанной выше. Я использую Windows 10, CMake 3.17.2, MinGW-w64 с GCC 8.1.0, но с другими компиляторами и архитектурами следующее работает так же, с необходимыми изменениями:
Загрузка исходного кода с сайта GLFW. На момент написания это была версия 3.3.2.
Строительство библиотеки:
Во-первых, разархивируйте исходный код и создайте внутри него папку build
(хотя вы можете создать ее вне исходной папки, нет никакой разницы) и запустите cmake -G "MinGW Makefiles" -S . -B build
(я рекомендую запустить where gcc
раньше, чтобы проверить, является ли путь GCC тем, указывая на MinGW-w64 bin
; см. этот пост)
Запустите в папке build
команду mingw32-make
. Это займет немного времени, так как будут созданы все цели, не только сама библиотека, но и документация и примеры. Если вы этого не хотите, вы можете вернуться к шагу 2.1 и запустить команду CMake с параметрами , как описано здесь (более простой вариант — просто использовать графический интерфейс CMake, где вы можете довольно легко включать и выключать эти параметры). ). Я хотел бы поблагодарить автора этого поста, чье точное описание процесса сборки (и тот факт, что он устанавливал GLFW с CMake, на Windows, как и я) мне очень помогло.
У вас должен быть файл cmake_install.cmake. Откройте его: вы должны увидеть в первых нескольких строках что-то вроде этого:
# Set the install prefix
if (NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/GLFW")
endif ()
Это путь CMAKE_INSTALL_PREFIX по умолчанию. Он сообщает программе make, куда установить зависимости: измените его на нужную папку, но имейте в виду, что она не будет создана, она должна уже существовать (и не забудьте изменить обратную косую черту \
на косую черту /
) . Теперь бегите mingw32-make install
. Вы должны увидеть в папке, которую вы дали, папки include
и lib
.
Редактирование CMakeLists.txt:
Теперь, когда вы создали свою библиотеку, вам нужно отредактировать файл CMakeLists.txt, чтобы связать GLFW с вашим проектом CMake. Типичный немодифицированный файл CMakeLists.txt выглядит так:
cmake_minimum_required(VERSION 3.17)
project(PROJECT_NAME)
set(CMAKE_CXX_STANDARD 17)
add_executable(PROJECT_NAME main.cpp)
Что вам нужно связать, это сначала установить переменную CMAKE_PREFIX_PATH. В моем случае я добавил эту строку перед add_executable(..)
:
set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/Dependencies/GLFW/lib/cmake/glfw3")
Это потому, что я хотел иметь зависимости GLFW в папке моего проекта. Тем не менее, это должно работать нормально, если вы также указали абсолютный путь: важно, чтобы папка содержала файлы glfw3Config.cmake и glfw3Targets.cmake (если вы правильно собрали библиотеку, вы должны найти их в разделе build_folder/lib/cmake/glfw3/
).
Теперь, когда вы сообщили CMake, где искать файл glfw3Config.cmake, вам нужно связать библиотеки с проектом. Вы можете сделать это, добавив после команды add_executable(..)
:
find_package(glfw3 REQUIRED)
target_link_libraries(PROJECT_NAME glfw)
Если это дает вам ошибку, например
By not providing "Findglfw3.cmake" in CMAKE_MODULE_PATH this project
has asked CMake to find a package configuration file provided by "glfw3", but
CMake did not find one.
Could not find a package configuration file provided by "glfw3" (requested
version 3.2) with any of the following names:
glfw3Config.cmake
glfw3-config.cmake
Add the installation prefix of "glfw3" to CMAKE_PREFIX_PATH or set
"glfw3_DIR" to a directory containing one of the above files. If "glfw3"
provides a separate development package or SDK, be sure it has been installed.
добавьте CONFIG
между glfw3
и REQUIRED
(подробнее см. здесь).
Последнее, что вам нужно сделать, это добавить строку include_directories(Dependencies/GLFW/include/GLFW/)
с путем к include
в папку сборки GLFW. Теперь CMakeLists.txt должен выглядеть так:
cmake_minimum_required(VERSION 3.17)
project(PROJECT_NAME)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/Dependencies/GLFW/lib/cmake/glfw3")
add_executable(PROJECT_NAME main.cpp)
include_directories(Dependencies/GLFW/include/GLFW/)
find_package(glfw3 REQUIRED)
target_link_libraries(PROJECT_NAME glfw)
Если вы добрались сюда без ошибок, поздравляю. Вы успешно связали GLFW с вашим проектом CMake! Теперь последнее, что нужно сделать, чтобы ваш проект заработал и вы могли написать некоторый базовый код OpenGL: измените часть find_package
на это:
find_package(OpenGL REQUIRED)
find_package(glfw3 REQUIRED)
target_link_libraries(PROJECT_NAME opengl32 glfw)
Как вы могли предположить, это свяжет OpenGL с проектом. Больше ничего делать не нужно, так как DLL OpenGL (opengl32.dll и glu32.dll) уже должна быть в C:\Windows\System32
.
Я надеюсь, что этот ответ поможет людям установить GLFW без необходимости тратить целый день на прокрутку форума QA, чтение документации и просмотр учебных пособий на Youtube.
Ого, наконец! После нескольких часов исследований я наконец сделал это! Большое спасибо!