CMake 的 GLFW 构建错误:“已考虑但未接受以下配置文件”

vro*_*uez 2 cmake glfw

我一直在尝试设置 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)
Run Code Online (Sandbox Code Playgroud)

我的 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})
Run Code Online (Sandbox Code Playgroud)

所有必需的 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
Run Code Online (Sandbox Code Playgroud)

我构建该库的方法是下载源代码,然后使用cmake -G "MinGW Makefiles"MinGW-w64 GCC 编译器,然后mingw32-make使用mingw32-make install. 然后我将构建文件复制到如上所示的文件夹中。

在寻找解决方案后,我发现问题可能来自于库和编译器使用的构建架构的差异(此处此处)。我使用 MinGW-w64 编译器并且更愿意坚持使用它,所以我尝试更改 CMake 构建。但是,我遇到了另一个问题,我无法使用-DCMAKE_GENERATOR_PLATFORM. 我尝试更改工具链,但这也不起作用;唯一的解决方案似乎是使用 Visual Studio 64 位工具链,但这不是我想要的。

有没有办法以 x64 架构的方式更改我的 CMake 构建?或者将我的编译器设置为 x86(如果这甚至有意义)以匹配“glfw3Config.cmake”版本?我对其他解决方案持开放态度,只要我可以保持我的项目结构和编译器不变。

vro*_*uez 6

所以我明白了问题所在。我的计算机上有MinGW-w64MinGW,并且它们的bin目录路径都在 PATH 中。where gcc例如,当运行时,bin会显示后者的路径,但不会显示前者。所以我从 PATH 中删除了 MinGW 的路径,重新启动计算机,按照之前的说明重新构建和重新编译,现在它可以工作了。

不过,我将此作为答案,是为了解释我安装 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 GUI,您可以在其中相当轻松地打开和关闭这些选项)。我要感谢这篇文章的作者,他对构建过程的精确描述(以及他像我一样在 Windows 上使用 CMake 安装 GLFW 的事实)对我帮助很大。

    3. 您应该有一个cmake_install.cmake文件。打开它:您应该在前几行中看到类似这样的内容:

      # Set the install prefix
      if(NOT DEFINED CMAKE_INSTALL_PREFIX)
        set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/GLFW")
      endif()
      
      Run Code Online (Sandbox Code Playgroud)

      这是默认的 CMAKE_INSTALL_PREFIX 路径。它告诉 make 程序在哪里安装依赖项:将其更改为您想要的文件夹,但请记住它不会被创建,它必须已经存在(并且不要忘记将反斜杠更改为\斜杠/)。现在运行mingw32-make install。您应该在您提供的文件夹中看到includelib文件夹。

  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)
      
      Run Code Online (Sandbox Code Playgroud)

      您需要链接的是首先设置 CMAKE_PREFIX_PATH 变量。就我而言,我之前添加了这一行add_executable(..)

      set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/Dependencies/GLFW/lib/cmake/glfw3")
      
      Run Code Online (Sandbox Code Playgroud)

      这是因为我想在我的项目文件夹中包含 GLFW 依赖项。但是,如果您也输入绝对路径,它应该可以正常工作:重要的是该文件夹包含glfw3Config.cmakeglfw3Targets.cmake文件(如果您正确构建了库,您应该在 下找到它们build_folder/lib/cmake/glfw3/)。

      现在您已经告诉 CMake 在哪里查找glfw3Config.cmake文件,您需要将库链接到项目。您可以通过在add_executable(..)命令后添加来完成此操作:

      find_package(glfw3 REQUIRED)
      target_link_libraries(PROJECT_NAME glfw)
      
      Run Code Online (Sandbox Code Playgroud)

      如果这给你一个错误,比如

      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.
      
      Run Code Online (Sandbox Code Playgroud)

      CONFIGglfw3和 之间添加REQUIRED(有关详细信息,请参阅此处)。

    2. 您需要做的最后一件事是在 GLFW 构建文件夹中添加include_directories(Dependencies/GLFW/include/GLFW/)带有路径的行。includeCMakeLists.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)
      
      Run Code Online (Sandbox Code Playgroud)

      如果您没有错误地到达这里,那么恭喜您。您已成功将 GLFW 链接到您的 CMake 项目!现在,最后一件事是让您的项目启动并运行并能够编写一些基本的 OpenGL 代码:将部分更改find_package为:

      find_package(OpenGL REQUIRED)
      find_package(glfw3 REQUIRED)
      target_link_libraries(PROJECT_NAME opengl32 glfw)
      
      Run Code Online (Sandbox Code Playgroud)

      正如您可能已经想到的,这会将 OpenGL 链接到项目。除此之外不需要做任何事情,因为 OpenGL DLL(opengl32.dllglu32.dll)应该已经在C:\Windows\System32.

我希望这个答案能够帮助人们安装 GLFW,而无需花费一天的时间进行论坛 QA 滚动、文档阅读和 Youtube 教程观看。