Cygwin OpenGL编译返回对imp_iob的未定义引用

时间:2013-09-15 19:03:37

标签: c++ opengl undefined-reference glew glfw

我正在尝试使用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

可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

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

cygwin / MinGW需要一些额外的帮助(要么必须使用用gcc编译的库,要么必须更改基于MSVC DLL的导入库)。有一篇文章解释了这个here

但是, 绝大部分时间 更简单的解决方案只是链接到库的静态链接版本。在GLEW和glfw的情况下,它们都带有静态库。您需要定义GLEW_STATIC并链接glew32s而不是glew。至于glfw,我并不熟悉 - 请参阅glfw的文档,了解如何执行此操作。