我一直在尝试设置 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”版本?我对其他解决方案持开放态度,只要我可以保持我的项目结构和编译器不变。
所以我明白了问题所在。我的计算机上有MinGW-w64和MinGW,并且它们的bin目录路径都在 PATH 中。where gcc例如,当运行时,bin会显示后者的路径,但不会显示前者。所以我从 PATH 中删除了 MinGW 的路径,重新启动计算机,按照之前的说明重新构建和重新编译,现在它可以工作了。
不过,我将此作为答案,是为了解释我安装 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 GUI,您可以在其中相当轻松地打开和关闭这些选项)。我要感谢这篇文章的作者,他对构建过程的精确描述(以及他像我一样在 Windows 上使用 CMake 安装 GLFW 的事实)对我帮助很大。
您应该有一个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。您应该在您提供的文件夹中看到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)
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.cmake和glfw3Targets.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)
CONFIG在glfw3和 之间添加REQUIRED(有关详细信息,请参阅此处)。
您需要做的最后一件事是在 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.dll和glu32.dll)应该已经在C:\Windows\System32.
我希望这个答案能够帮助人们安装 GLFW,而无需花费一天的时间进行论坛 QA 滚动、文档阅读和 Youtube 教程观看。
| 归档时间: |
|
| 查看次数: |
5054 次 |
| 最近记录: |