【问题标题】:How can I have freeglut 3.2.1 and GLEW 2.1.0 run on MinGW-w64?如何在 MinGW-w64 上运行 freeglut 3.2.1 和 GLEW 2.1.0?
【发布时间】:2020-12-07 01:10:57
【问题描述】:

我对编程有点陌生,我正在尝试让 OpenGL 程序在 X64bit C++ 编译器上运行。该代码在安装了freeglut 3.0.0 MinGW PackageMinGW - Minimalist GNU for Windows 上运行。

我正在尝试使用我的程序:

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

显示它按照说明正确安装。

然后我在我的 CLion 编辑器(文件>设置>构建、执行、部署>工具链)中更新了选择为 MinGW-w64 的 MinGW,然后点击构建按钮。下面是它给出的错误。

在我的 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

【问题讨论】:

  • 看来您的目标 (SnakeGame_lib) 确实是为 64 位构建的,但出于某种原因,您决定将其显式链接到 32 位库(lopengl32、lglew32 等)。我认为这是不可能的。你能把它们改成64位吗?还是完全省略架构?
  • 如何将它们更改为 64 位?省略架构是什么意思?您的意思是放弃 OpenGL 并为 c++ 使用不同的图形库吗?
  • -lopengl 而不是 -lopengl32
  • 不,如果我这样做,它只是为他们说这个。 C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lopengl
  • 考虑到您在 Windows 上构建它,这可能会对您有所帮助:stackoverflow.com/questions/1236670/…。看来您应该在其他地方寻找 glew 。但我看到由于历史原因,甚至 64 位 OpenGL 也被称为 OpenGL32。

标签: windows clion mingw-w64 glew freeglut


【解决方案1】:

所以,如果您在动态链接 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

您可以省略安装,因为我们稍后会传递库路径。只需确保 glew 库在 make 之后出现在 /lib 目录中即可。

构建/链接 freeglut

至于 freeglut,我建议从这里下载二进制文件:https://www.transmissionzero.co.uk/software/freeglut-devel/(freeglut 3.0.0 MinGW Package - 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)

我相信你安装的头文件应该是兼容的。

如果有帮助,请告诉我。

【讨论】:

  • 抱歉,Marek,我真的很忙于其他项目,不得不把这个放在次要位置。当我得到它时,我会告诉你你的解决方案是否对我有用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 2020-05-23
  • 2021-10-23
  • 1970-01-01
相关资源
最近更新 更多