将 GLEW 与 MinGW64 链接 - 对“__imp_glewExperimental”和“__imp___glewGenVertexArrays”的未定义引用
linking GLEW with MinGW64 - undefined reference to `__imp_glewExperimental' and `__imp___glewGenVertexArrays'
undefined reference to '[various things from GLEW library]'
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.7)
project(newerOpenGLTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(newerOpenGLTest ${SOURCE_FILES})
find_package(OpenGL)
# tell it where to look for glew
set(CMAKE_PREFIX_PATH "F:/glew-2.0.0")
set(CMAKE_LIBRARY_PATH "F:/glew-2.0.0/lib/Release/x64")
find_package(GLEW REQUIRED)
if (GLEW_FOUND)
message(${GLEW_INCLUDE_DIRS})
message(${GLEW_LIBRARIES})
# Detect and add SFML
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
#Find any version 2.X of SFML
#See the FindSFML.cmake file for additional details and instructions
find_package(SFML 2 REQUIRED graphics window system)
if(SFML_FOUND)
include_directories(
${GLEW_INCLUDE_DIRS}
${SFML_INCLUDE_DIR}
)
target_link_libraries(
newerOpenGLTest
${GLEW_LIBRARIES}
${SFML_LIBRARIES}
${SFML_DEPENDENCIES}
${OPENGL_gl_LIBRARY}
)
endif()
endif()
这是 Cmake 的输出:
F:/glew-2.0.0/include
F:/glew-2.0.0/lib/Release/x64/glew32.lib
-- Found SFML 2.4.2 in F:/SFML-2.4.2 for GCC 6.1.0 MinGW (SEH) - 64-bit/include
-- Configuring done
-- Generating done
-- Build files have been written to: F:/Users/Doug/CLionProjects/newerOpenGLTest/cmake-build-debug
我觉得一切都很好。它会找到 GLEW 并找到包含文件和库的位置。
这是我的 main.cpp:
#include <GL/glew.h>
#include <SFML/Window.hpp>
int main() {
sf::Window window(sf::VideoMode(800, 600), "openGL");
window.setVerticalSyncEnabled(true);
window.setActive(true);
// Initialize GLEW
glewExperimental = true;
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
bool running = true;
while (running) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
running = false;
}
}
}
return 0;
}
这是链接的输出:
Linking CXX executable newerOpenGLTest.exe
CMakeFiles\newerOpenGLTest.dir\build.make:100: recipe for target 'newerOpenGLTest.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/newerOpenGLTest.dir/all' failed
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/newerOpenGLTest.dir/rule' failed
Makefile:117: recipe for target 'newerOpenGLTest' failed
CMakeFiles\newerOpenGLTest.dir/objects.a(main.cpp.obj): In function `main':
main.cpp:xx: undefined reference to `__imp_glewExperimental'
main.cpp:xx: undefined reference to `__imp___glewGenVertexArrays'
main.cpp:xx: undefined reference to `__imp___glewBindVertexArray'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [newerOpenGLTest.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/newerOpenGLTest.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/newerOpenGLTest.dir/rule] Error 2
mingw32-make.exe: *** [newerOpenGLTest] Error 2
对 3 个 GLEW 元素的未定义引用。
注意它没有说 undefined reference to '__imp_glewInit'
所以它链接了一些 GLEW,但不是所有内容。
I 运行 glewinfo.exe
并且输出有 glGenVertexArrays: OK
我认为这意味着我的驱动程序支持该功能。
显然,来自 GLEW 网站的二进制文件仅适用于 Visual C++。
如果你想和 MinGW 一起使用,你必须自己编译。
从此处复制的说明:
1) 下载 GLEW 源文件。请勿下载 32/64 位 Window 二进制文件,除非您正在使用 Visual Studio,如果您使用 Visual Studio,您将不会阅读本文。
2) 下载、安装和更新 msys2。不幸的是,如果没有它,我无法找到编译 GLEW(针对 mingw-w64)的方法,但是相信我,它是无痛的,一旦你完成了,你就不需要 msys2,我们只用它来编译GLEW 库文件。在执行任何其他操作之前,请按照官方 msys2 站点上的更新说明进行操作。它只有3步长。
警告:由于某些奇怪的原因,一旦您通过了第二个更新步骤,msys2 命令提示符快捷方式将在我的计算机上停止工作。只需导航到 c:/msys2 文件夹,如果有 运行 msys2_shell.cmd。
3) msys2 需要 mingw-w64。 Stack Overflow 的一些答案建议同时下载 64 位和 32 位版本的 mingw,但由于我不是这方面的专家,所以它变得很痛苦,所以我最好只下载我正在使用和定位的 64 位版本. 运行 在 msys2 cmd 提示符下执行以下命令: $ pacman -S gcc make mingw-w64-x86_64-gcc
3-a) 对于 msys2,您需要 make 和 gcc。 运行 在 msys2 cmd 行中:$ pacman -S gcc make
4) 下载完 mingw-w64、gcc 和 make 后。您已准备好编译 GLEW。解压您之前下载的源文件,并将其放入您的C:\msys64\home\yourusername文件夹中。
5) 打开 msys2 cmd 提示符,导航到 glew2.x.x 文件夹并按以下顺序 运行 以下 CMD(每个完成后立即执行):
5-a) 制作
5-b) 安装
5-c) 使 install.all
6) 您可能会收到一些错误和警告,请不要担心。查看 glew2.x.x 文件夹中的 lib 文件夹,您会看到所需的 lib 文件。
7) 将 glew32.dll 复制到您的程序可执行文件所在的同一文件夹中,并将 libglew32.a 复制到您程序的 lib 文件夹中。
undefined reference to '[various things from GLEW library]'
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.7)
project(newerOpenGLTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(newerOpenGLTest ${SOURCE_FILES})
find_package(OpenGL)
# tell it where to look for glew
set(CMAKE_PREFIX_PATH "F:/glew-2.0.0")
set(CMAKE_LIBRARY_PATH "F:/glew-2.0.0/lib/Release/x64")
find_package(GLEW REQUIRED)
if (GLEW_FOUND)
message(${GLEW_INCLUDE_DIRS})
message(${GLEW_LIBRARIES})
# Detect and add SFML
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
#Find any version 2.X of SFML
#See the FindSFML.cmake file for additional details and instructions
find_package(SFML 2 REQUIRED graphics window system)
if(SFML_FOUND)
include_directories(
${GLEW_INCLUDE_DIRS}
${SFML_INCLUDE_DIR}
)
target_link_libraries(
newerOpenGLTest
${GLEW_LIBRARIES}
${SFML_LIBRARIES}
${SFML_DEPENDENCIES}
${OPENGL_gl_LIBRARY}
)
endif()
endif()
这是 Cmake 的输出:
F:/glew-2.0.0/include
F:/glew-2.0.0/lib/Release/x64/glew32.lib
-- Found SFML 2.4.2 in F:/SFML-2.4.2 for GCC 6.1.0 MinGW (SEH) - 64-bit/include
-- Configuring done
-- Generating done
-- Build files have been written to: F:/Users/Doug/CLionProjects/newerOpenGLTest/cmake-build-debug
我觉得一切都很好。它会找到 GLEW 并找到包含文件和库的位置。
这是我的 main.cpp:
#include <GL/glew.h>
#include <SFML/Window.hpp>
int main() {
sf::Window window(sf::VideoMode(800, 600), "openGL");
window.setVerticalSyncEnabled(true);
window.setActive(true);
// Initialize GLEW
glewExperimental = true;
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
bool running = true;
while (running) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
running = false;
}
}
}
return 0;
}
这是链接的输出:
Linking CXX executable newerOpenGLTest.exe
CMakeFiles\newerOpenGLTest.dir\build.make:100: recipe for target 'newerOpenGLTest.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/newerOpenGLTest.dir/all' failed
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/newerOpenGLTest.dir/rule' failed
Makefile:117: recipe for target 'newerOpenGLTest' failed
CMakeFiles\newerOpenGLTest.dir/objects.a(main.cpp.obj): In function `main':
main.cpp:xx: undefined reference to `__imp_glewExperimental'
main.cpp:xx: undefined reference to `__imp___glewGenVertexArrays'
main.cpp:xx: undefined reference to `__imp___glewBindVertexArray'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [newerOpenGLTest.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/newerOpenGLTest.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/newerOpenGLTest.dir/rule] Error 2
mingw32-make.exe: *** [newerOpenGLTest] Error 2
对 3 个 GLEW 元素的未定义引用。
注意它没有说 undefined reference to '__imp_glewInit'
所以它链接了一些 GLEW,但不是所有内容。
I 运行 glewinfo.exe
并且输出有 glGenVertexArrays: OK
我认为这意味着我的驱动程序支持该功能。
显然,来自 GLEW 网站的二进制文件仅适用于 Visual C++。
如果你想和 MinGW 一起使用,你必须自己编译。
从此处复制的说明:
1) 下载 GLEW 源文件。请勿下载 32/64 位 Window 二进制文件,除非您正在使用 Visual Studio,如果您使用 Visual Studio,您将不会阅读本文。
2) 下载、安装和更新 msys2。不幸的是,如果没有它,我无法找到编译 GLEW(针对 mingw-w64)的方法,但是相信我,它是无痛的,一旦你完成了,你就不需要 msys2,我们只用它来编译GLEW 库文件。在执行任何其他操作之前,请按照官方 msys2 站点上的更新说明进行操作。它只有3步长。
警告:由于某些奇怪的原因,一旦您通过了第二个更新步骤,msys2 命令提示符快捷方式将在我的计算机上停止工作。只需导航到 c:/msys2 文件夹,如果有 运行 msys2_shell.cmd。
3) msys2 需要 mingw-w64。 Stack Overflow 的一些答案建议同时下载 64 位和 32 位版本的 mingw,但由于我不是这方面的专家,所以它变得很痛苦,所以我最好只下载我正在使用和定位的 64 位版本. 运行 在 msys2 cmd 提示符下执行以下命令: $ pacman -S gcc make mingw-w64-x86_64-gcc
3-a) 对于 msys2,您需要 make 和 gcc。 运行 在 msys2 cmd 行中:$ pacman -S gcc make
4) 下载完 mingw-w64、gcc 和 make 后。您已准备好编译 GLEW。解压您之前下载的源文件,并将其放入您的C:\msys64\home\yourusername文件夹中。
5) 打开 msys2 cmd 提示符,导航到 glew2.x.x 文件夹并按以下顺序 运行 以下 CMD(每个完成后立即执行): 5-a) 制作 5-b) 安装 5-c) 使 install.all
6) 您可能会收到一些错误和警告,请不要担心。查看 glew2.x.x 文件夹中的 lib 文件夹,您会看到所需的 lib 文件。
7) 将 glew32.dll 复制到您的程序可执行文件所在的同一文件夹中,并将 libglew32.a 复制到您程序的 lib 文件夹中。