【问题标题】:Undefined References to _imp____glew* functions with minGW gcc使用 minGW gcc 对 _imp____glew* 函数的未定义引用
【发布时间】:2013-08-30 18:41:41
【问题描述】:

我正在尝试在 Win 7 x64 系统上使用 MinGW 编译一个相对简单的 OpenGL 程序,但我不断收到对几个 GLEW 函数的未定义引用。我已将库设置为链接到程序,并一直在寻找我的列表中可能缺少的任何库,但链接器的输出仍然如下所示:

16:35:50 **** Incremental Build of configuration Debug for project test ****
Info: Internal Builder is used for build
gcc -LD:/DEV/openGL/lib/x86 -LD:/DEV/x86/lib -o test.exe test.o -lfreeglut -lglaux -lglew32s -lglu32 -lglfw3 -lopengl32 -lgdi32 
test.o: In function `init':
E:\Development\C\test\Debug/../test.c:32: undefined reference to `_imp____glewGenVertexArrays'
E:\Development\C\test\Debug/../test.c:33: undefined reference to `_imp____glewBindVertexArray'
E:\Development\C\test\Debug/../test.c:35: undefined reference to `_imp____glewGenBuffers'
E:\Development\C\test\Debug/../test.c:36: undefined reference to `_imp____glewBindBuffer'
E:\Development\C\test\Debug/../test.c:37: undefined reference to `_imp____glewBufferData'
test.o: In function `display':
E:\Development\C\test\Debug/../test.c:45: undefined reference to  `_imp____glewBindVertexArray'
test.o: In function `main':
E:\Development\C\test\Debug/../test.c:61: undefined reference to `_imp__glewInit@0'
collect2: ld returned 1 exit status

16:35:50 Build Finished (took 675ms)

我在几种不同的配置中尝试了 -lglew32 和 -lglew32s,认为 glew32s 中可能有 glew32 中没有的定义,但这没有帮助。关于我可能缺少什么或我忽略了什么的任何指导?

【问题讨论】:

    标签: c windows opengl mingw undefined-reference


    【解决方案1】:

    如果您使用静态链接库,您需要在#include "glew.h" 之前#define GLEW_STATIC。我会继续在你的 Makefile 中添加一个规则来定义这个预处理器令牌,而不是实际将 #define ... 放入你的源代码中。

    顺便说一句,这在 GLEW 的 installation documentation 中有所提及。但从这个问题被问到的次数来看,可能表述的不够清楚。


    更新:

    定义此标记的原因是 Microsoft Windows 使用特殊的__declspec (...) 进行 DLL 导入和导出。通过定义GLEW_STATIC,您告诉链接器使用标准行为来定位.lib 中的符号。

    GLEW_STATIC 未定义时,它会通知链接器库的符号在运行时被解析。但是 MSVC 需要知道它是在创建导出还是在寻找导入,因此还有另一个令牌 GLEW_BUILD 定义了这种行为。由于您要链接到(导入)而不是构建(导出)GLEW,请确保您不要定义GLEW_BUILD

    /*
     * GLEW_STATIC is defined for static library.
     * GLEW_BUILD  is defined for building the DLL library.
     */
    
    #ifdef GLEW_STATIC
    #  define GLEWAPI extern
    #else
    #  ifdef GLEW_BUILD
    #    define GLEWAPI extern __declspec(dllexport)
    #  else
    #    define GLEWAPI extern __declspec(dllimport)
    #  endif
    #endif
    


    还值得一提的是,您不能使用 GLEW 官方网站上提供的预构建动态链接 .lib 和 DLL 文件。它们是使用 MSVC 编译的;要在 MinGW 中使用用 MSVC 编译的 DLL,请参阅this link。更好的解决方案就是避免使用动态链接库而使用静态库。

    【讨论】:

    • 我无法将您的回复作为此问题的答案。首先,它只涉及与 glew32s 的链接,而不是 glew32,因此不能完全回答这个问题。其次,由于您的烦恼,您对这个问题投了反对票,无视我在询问之前为寻找解决方案所做的任何努力。第三,您忽略了由于对所使用的模块不熟悉而导致的缺乏理解。不是每个人都喜欢 OpenGL,因为“DirectX 更简单”。我不是那种人,但我希望理解,而不是鄙视,在尝试学习时犯错误。
    • @CalebWaggoner 如果这让你感觉好些,我不是拒绝你的问题的人。您清楚地展示了解决此问题的努力并解释了您采取的步骤,就我而言,您的问题没有任何问题。否则我不会写答案。至于构建动态库,请阅读安装文档——我希望解释GLEW_STATIC令牌并指向您的安装说明足以让您在文档中发现GLEW_BUILD令牌。
    • 感谢您填写有关此问题的更多详细信息,因为这将有助于下一个提出相同问题的人。由于大量使用 MSDN,我对 API 文档有点怀疑,但似乎我也必须努力解决这个问题。另外,很抱歉指责您投了反对票。再次感谢您。
    • 欺骗了我一阵子的是,我必须在编译静态 glew 库时定义 GLEW_STATIC在使用静态库的项目中。
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多