0

我正在尝试使用 Cygwin编译本教程http://www.opengl-tutorial.org/beginners-tutorials/tutorial-1-opening-a-window/ 。我收到以下错误:

$ g++ main.cpp -o main -lm -lgl -lglut -lglew -lglfw -lopengl32 -lglu32 -lglaux
 -lodbc32 -lodbccp32
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../libglfw.a(win32_window.o):win32_windo
w.c:(.text+0x11a0): undefined reference to `_imp___iob'
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../libglfw.a(win32_window.o):win32_windo
w.c:(.text+0x11c8): undefined reference to `_imp___iob'
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../libglfw.a(win32_window.o):win32_windo
w.c:(.text+0x11f0): undefined reference to `_imp___iob'
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../libglfw.a(win32_window.o):win32_windo
w.c:(.text+0x1394): undefined reference to `_imp___iob'
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../libglfw.a(win32_window.o):win32_windo
w.c:(.text+0x1661): undefined reference to `_imp___iob'
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../libglfw.a(win32_window.o):win32_windo
w.c:(.text+0x1696): more undefined references to `_imp___iob' follow
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../../i686-pc-cygwin/bin/ld: /usr/lib/gc
c/i686-pc-cygwin/4.7.3/../../../libglfw.a(win32_window.o): bad reloc address 0x0
 in section `.rdata'
collect2: error: ld returned 1 exit status

这可能是什么原因造成的?

4

1 回答 1

1

当您看到未解析的符号时_imp__,这意味着您正在尝试链接一个库,该库是为在运行时使用 DLL 而构建的。从技术上讲,问题在于 MSVC 编译器如何破坏__stdcall函数的导入存根 - 它预先修复了 gcc 不期望的下划线(例如_imp,而不是imp)。

cygwin/MinGW 需要一点额外的帮助(要么他们必须使用用 gcc 编译的库,要么必须更改基于 MSVC DLL 的导入库)。这里有一篇文章对此进行了解释。

但是,绝大多数情况下,更简单的解决方案只是链接库的静态链接版本。对于 GLEW 和 glfw,它们都附带静态库。您将需要定义GLEW_STATIC和链接glew32s而不是glew. 至于 glfw,我不太熟悉 - 请参阅 glfw 的文档以了解如何执行此操作。

于 2013-09-15T20:32:40.193 回答