Ошибка сборки GLFW с CMake: «Следующие файлы конфигурации были рассмотрены, но не приняты»

Я пытался настроить 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»? Я открыт для других решений, пока я могу сохранить структуру проекта и компилятор такими, какие они есть.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
3 743
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так я понял в чем проблема. У меня на компьютере были и MinGW-w64 , и MinGW, и оба их bin пути к каталогам в PATH. Например, при запуске where gcc последний bin путь показывался, а не первый. Поэтому я удалил пути MinGW из PATH, перезагрузил компьютер, пересобрал и перекомпилировал, как объяснялось ранее, и теперь все работает.

Однако я делаю это как ответ, чтобы объяснить шаги, которые я предпринял для установки GLFW, что было чем-то вроде кошмара и где я столкнулся со многими проблемами до описанной выше. Я использую Windows 10, CMake 3.17.2, MinGW-w64 с GCC 8.1.0, но с другими компиляторами и архитектурами следующее работает так же, с необходимыми изменениями:

  1. Загрузка исходного кода с сайта GLFW. На момент написания это была версия 3.3.2.

  2. Строительство библиотеки:

    1. Во-первых, разархивируйте исходный код и создайте внутри него папку build (хотя вы можете создать ее вне исходной папки, нет никакой разницы) и запустите cmake -G "MinGW Makefiles" -S . -B build (я рекомендую запустить where gcc раньше, чтобы проверить, является ли путь GCC тем, указывая на MinGW-w64 bin; см. этот пост)

    2. Запустите в папке build команду mingw32-make. Это займет немного времени, так как будут созданы все цели, не только сама библиотека, но и документация и примеры. Если вы этого не хотите, вы можете вернуться к шагу 2.1 и запустить команду CMake с параметрами , как описано здесь (более простой вариант — просто использовать графический интерфейс CMake, где вы можете довольно легко включать и выключать эти параметры). ). Я хотел бы поблагодарить автора этого поста, чье точное описание процесса сборки (и тот факт, что он устанавливал GLFW с CMake, на Windows, как и я) мне очень помогло.

    3. У вас должен быть файл 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.

  3. Редактирование CMakeLists.txt:

    1. Теперь, когда вы создали свою библиотеку, вам нужно отредактировать файл 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 (подробнее см. здесь).

    2. Последнее, что вам нужно сделать, это добавить строку 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.

Ого, наконец! После нескольких часов исследований я наконец сделал это! Большое спасибо!

Zenthm 02.08.2022 09:36

Другие вопросы по теме