【问题标题】:How to use GLEW with MinGW [duplicate]如何将 GLEW 与 MinGW 一起使用 [重复]
【发布时间】:2012-02-10 20:24:12
【问题描述】:

我试图使用 glew32.lib 文件链接到我的项目中,而不是我自己编译 Glew 源以获得 glew.a 文件。现在,我的项目中有这些链接错误:

g++ -o Chapter10(OpenCLTest).exe src\Chapter10(OpenCLTest).o -lopengl32 -lglew -lglut32 -lglu32 -lopencl
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x167): undefined reference to `_imp____glewBindBuffer'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x39a): undefined reference to `_imp__glewInit'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x3a7): undefined reference to `_imp__glewIsSupported'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x48a): undefined reference to `_imp____glewGenBuffers'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x495): undefined reference to `_imp____glewBindBuffer'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x4dd): undefined reference to `_imp____glewBufferData'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x50b): undefined reference to `_imp____glewGetBufferParameteriv'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x1d67): undefined reference to `_imp____glewBindBuffer'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x1d7f): undefined reference to `_imp____glewDeleteBuffers'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x1d95): undefined reference to `_imp____glewBindBuffer'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x1dad): undefined reference to `_imp____glewDeleteBuffers'
src\Chapter10(OpenCLTest).o:Chapter10(OpenCLTest).cpp:(.text+0x2078): undefined reference to `_imp____glewBindBuffer'
collect2: ld returned 1 exit status

解决这个问题很好,但顺便问一下,gl扩展还有其他opengl实现吗?

【问题讨论】:

  • 恐怕您需要找到用 g++ 编译的库或自己构建它们。
  • 您使用的是哪个编译器?哪个操作系统?我认为只需向编译器指定在哪里可以找到 lib 文件(或 .so 取决于我们正在谈论的系统)。我在我的 Linux Box 上使用 GLEW 已经一年多了,一切都非常简单。请告诉我。

标签: c++ c opengl mingw glew


【解决方案1】:

奇怪的是没有人对此发表任何评论。默认情况下,在 Windows 上,GLEW 标头对所有外部函数使用declspec(dllimport),这会破坏它们的所有名称。这就是为什么所有缺少的外部符号名称都在前面有_imp____

如果您不想使用 GLEW 的静态构建(您提到了一些关于 libglew.a 的内容),请在构建 GLEW 和构建应用程序期间定义 GLEW_STATIC。这将解开静态链接的名称。

如果您想链接到 GLEW 的共享库版本,请确保使用 GLEW_BUILD 构建 GLEW。我不确定 gcc 是否有必要这样做,但如果库是用 MSVC 构建的。

此外,GNU 工具链实际上支持 Microsoft 的 .lib 链接格式。 source

您可能会发现自己编译 GLEW 甚至将其包含在您的项目中是最简单的。它只有一个源文件和几个头文件。要手动编译库,请使用类似于gcc -shared -o libGLEW.dll -Wl,--out-implib=libGLEW.dll.a -O2 -DGLEW_BUILD glew.c 的内容。要获取静态版本,请改用 gcc -c -O2 -DGLEW_STATIC glew.c 之类的东西。

【讨论】:

    【解决方案2】:

    (我知道这有点晚了,但我认为它可能会解决其他人的问题,所以)我在编译一个动态链接到 GLEW 的程序时遇到了一个非常相似的问题。事实证明,我忽略了libglew32.dll.a 文件——它也需要存在(除了我之前复制到我的项目文件夹中的libglew32.aglew32.dll。)

    【讨论】:

    • 我刚才遇到了同样的问题,解决了。我怀疑它是解决方案,但并不急于整个重新编译过程。无论如何,下载源代码,使用 mingw (4.8) make 编译,然后将其复制到与 .exe 相同的位置 - 仅供将来参考。
    【解决方案3】:

    你可以试试GLee,它的作用与 GLEW 基本相同。

    【讨论】:

      【解决方案4】:

      恐怕您不能将 glew.lib 与 g++ 一起使用(因为 .lib 是 Microsoft 的专有格式)。您遇到的这些错误缺少函数入口点,这意味着您没有正确编译 GLEW(所需的函数未导出到您的 .so 中 - 需要了解更多详细信息才能解决此问题)。

      至于问题的另一部分,你可以试试GLEH。它仍处于开发阶段,可能需要进行一些调整才能为您工作,但我们已经在 linux 中非常成功地使用它,所以它应该不会太糟糕。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-04
        • 2011-01-23
        • 2012-02-05
        • 1970-01-01
        相关资源
        最近更新 更多