链接库是不是像指定库的路径和头文件的路径那么简单?

时间:2017-07-22 10:06:47

标签: opengl gcc cygwin dynamic-linking glew

上下文:

  • cygwin-gcc作为我的终端和编译器

  • 尝试将OpenGL用于我的程序,它需要GLEW扩展才能使其正常工作。我选择将我的程序动态链接到所需的库。

  • 下载,安装' d,glew库和头文件。

  • 将.dll文件放在usr / local / lib文件夹中,包括最初来自system32文件夹的opengl32.dll进行测试,但仍无效。

  • 将头文件放在/ usr / local / include文件夹

问题:

  • 获取对函数的未定义引用。

输入命令:

gcc -o TestGameBoy TestGameBoy.c -I/usr/local/include/GL -L/usr/local/lib -lglew32 -lglu32 -lopengl32

编辑:-opengl32更改为-lopengl32,但只是一个错字。

链接输出错误:

/tmp/cc0Qp34q.o: In function `initWindowComponents':
/cygdrive/d/DMG_Emulator/BGWindow.c:35: undefined reference to `glewExperimental'
/cygdrive/d/DMG_Emulator/BGWindow.c:36: undefined reference to `glewInit'
/cygdrive/d/DMG_Emulator/BGWindow.c:48: undefined reference to `glGenTextures'
/cygdrive/d/DMG_Emulator/BGWindow.c:50: undefined reference to `glBindTexture'
/cygdrive/d/DMG_Emulator/BGWindow.c:54: undefined reference to `glTexImage2D'
collect2: error: ld returned 1 exit status

注意:我没有包含SDL部分,因为它已经在工作。我设法遵循其参数列表,但不知何故不适用于glew。

我想相信这是因为链接器实际上并没有将库加载到ram中。那么它无法填充那些需要定义内存地址的函数内存空间的汇编调用所需的数据?我不知道我在观看视频可能是我的问题后,主要是在理论化自己。但这确实对我有意义,虽然不知怎的,我无法让它发挥作用。

2 个答案:

答案 0 :(得分:0)

从不(!!!) 触摸位于system32SysWow64的任何内容!这些是操作系统资源,并且从长远来看这些将会引起很多麻烦。

至于使用(现代)OpenGL与Cygwin ...这是一种PITA。你有这个XWin / GLX包装器,因此为X11编写的程序可以在Cygwin X11服务器内运行。这反过来意味着在Cygwin中你正在处理* nix-ish OpenGL库名,即-lGL -lGLX -l…(可能也需要X库)。这也意味着您无法直接与纯Cygwin环境中的本机OpenGL实现交谈。

链接器调用中可能存在(可能)错误。它通常是-l…但你有-opengl32(删除了l)。然而,链接器应该抱怨指定的每个错误的选项或库,但它找不到。

我强烈建议使用MinGW / MSys2代替Cygwin,它可以为您提供真正的原生Windows API环境,让事情变得更轻松。 MSys2使用Pacman软件包管理器(Arch Linux),并且环境友好。它为您提供了所有* nix-ish开发工具(GCC / Clang,Shells等),但它是本机Win32。

答案 1 :(得分:0)

opengl32.dll是一个共享库,但不是编译器所需的导入库。 opengl32.dll也与cygwin中cyg*.dll

中预期的共享库名称不匹配

安装cygwin libGLEW-devel包。它将提供正确的GLEW导入库和标题

内容列于上 https://cygwin.com/packages/x86_64/libGLEW-devel/libGLEW-devel-1.13.0-1

2016-07-21 22:36     1018809 usr/include/GL/glew.h
2016-07-21 22:36       73140 usr/include/GL/glxew.h
2016-07-21 22:36           0 usr/lib/
2016-07-21 22:36     2106644 usr/lib/libGLEW.dll.a
2016-07-21 22:36     1667262 usr/lib/libGLEWmx.dll.a
2016-07-21 22:36           0 usr/lib/pkgconfig/
2016-07-21 22:36         222 usr/lib/pkgconfig/glew.pc
2016-07-21 22:36         233 usr/lib/pkgconfig/glewmx.pc

您还可以使用glewOpenGL Extension Wrangler demos来测试正确的安装。