如何在MinGW-w64上运行freeglut 3.2.1和GLEW 2.1.0?

问题描述

我对编程有点陌生,我正在尝试让OpenGL程序在X64位C ++编译器上运行。该代码适用于MinGW - Minimalist GNU for Windows,并且安装了freeglut 3.0.0 MinGW Package

我正在尝试让我的程序与之一起工作:

    在这些stackoverflow instructions之后安装的
  1. MinGW-w64。
  2. 我还按照这些medium.com instructions安装了freeglut 3.2.1和GLEW 2.1.0(跳过步骤1-3,因为我已经安装了CLion的cmake和MinGW-w64)。

显示,表明它们已按照说明正确安装。

然后,我在CLion编辑器中将选定的MinGW更新为MinGW-w64(“文件”>“设置”>“构建”,“执行”,“部署”>“工具链”),然后单击“构建”按钮。波纹管是它给的错误。

在我的CMakeLists.txt中,我有target_link_libraries(SnakeGame_run SnakeGame_lib -lopengl32 -lglew32 -lfreeglut -lglu32)。并且在代码中,无论我在哪里使用#include <GL/freeglut.h>,我之前都包含#include <GL/glew.h>。据我所知,我已经完成所有设置,但是在编译时它不会链接freeglut或GLEW(如果我理解正确的话)。

如何使这两个库兼容?

"C:\...\JetBrains\CLion 2019.3.4\bin\cmake\win\bin\cmake.exe" --build C:\...\Snake-Game\cmake-build-debug --target SnakeGame_run -- -j 9
[ 81%] Built target SnakeGame_lib
[90%] Linking CXX executable SnakeGame_run.exe
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libglew32.dll.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libglew32.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/../lib\libglew32.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libglew32.dll.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libglew32.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib\libglew32.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libglew32.dll.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libglew32.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libglew32.dll.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libglew32.a when searching for -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lglew32
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libfreeglut.dll.a when searching for -lfreeglut
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libfreeglut.dll.a when searching for -lfreeglut
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libfreeglut.dll.a when searching for -lfreeglut
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libfreeglut.dll.a when searching for -lfreeglut
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lfreeglut

解决方法

因此,如果您在动态链接GLEW和freeglut时遇到麻烦,我建议您可以自己构建库并进行静态链接。

构建GLEW

假设您已经安装了MSYS2 / Mingw-w64工具链,请从所包含的媒体链接下载GLEW源,并根据README指令构建该库:

#### MSYS2/Mingw-w64

Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/)

Requirements: bash,make,gcc

    $ pacman -S gcc make  mingw-w64-i686-gcc mingw-w64-x86_64-gcc 
    $ make
    $ make install
    $ make install.all

您可以省略安装,因为无论如何我们稍后将传递库路径。只需确保在make之后在/ lib目录中显示了glew库。

建立/链接freeglut

关于freeglut,我建议从此处下载二进制文件:https://www.transmissionzero.co.uk/software/freeglut-devel/(freeglut 3.0.0 MinGW软件包-https://www.transmissionzero.co.uk/files/software/development/GLUT/freeglut-MinGW.zip)。解压缩软件包后,有一个/ lib文件夹,其中包含x64目录。因此,我们将链接这些库。顾名思义,它们用于x64体系结构。

将它们链接在一起

这不是在target_link_libraries中显式放置库名称的最佳实践,但请坚持使用。如果可行,则可以稍后对其进行重构。

到目前为止,这是您的cmake命令: target_link_libraries(SnakeGame_run SnakeGame_lib -lopengl32 -lglew32 -lfreeglut -lglu32) 现在,lopengl32和lglu32似乎可以正确链接,而lglew32和lfreeglut出了问题,但是在前面的步骤中,我们确保确定有x64二进制文件。但是,现在我们必须确保您的应用程序与正确的库链接,因此出于测试目的,CMake允许我们指定库(https://cmake.org/cmake/help/v3.3/command/target_link_libraries.html)的完整路径。因此,假设GLEW位于C:\Projects\my_downloaded_glew中,并且构建的库显示为C:\Projects\my_downloaded_glew\lib\libglew32,我们必须将-lglew32替换为C:\Projects\my_downloaded_glew\lib\libglew32。现在,在下载freeglut之后,我假设下载的GLUT二进制文件位于C:\Projects\my_downloaded_freeglut\lib\x64\中,因此-lfreeglut必须替换为C:\Projects\my_downloaded_freeglut\lib\x64\libfreeglut。放在一起,可以尝试以下方法:

target_link_libraries(SnakeGame_run SnakeGame_lib -lopengl32 C:\Projects\my_downloaded_glew\lib\libglew32 C:\Projects\my_downloaded_freeglut\lib\x64\libfreeglut -lglu32)

我相信您安装的标头应该兼容。

让我知道是否有帮助。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...