问题描述
我对编程有点陌生,我正在尝试让OpenGL程序在X64位C ++编译器上运行。该代码适用于MinGW - Minimalist GNU for Windows,并且安装了freeglut 3.0.0 MinGW Package。
我正在尝试让我的程序与之一起工作:
-
在这些stackoverflow instructions之后安装的
- MinGW-w64。
- 我还按照这些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)
我相信您安装的标头应该兼容。
让我知道是否有帮助。