将 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 一起使用,你必须自己编译。

从此处复制的说明:

https://www.opengl.org/discussion_boards/showthread.php/198730-How-do-I-build-GLEW-for-mingw-w64-using-cmake-on-Windows

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 文件夹中。