交叉编译 linux-->windows:使用 opengl32 获得更新的 OpenGL 支持.dll
Cross-compiling linux-->windows: Getting newer OpenGL support with opengl32.dll
我使用x86_64-w64-mingw32
工具集和gcc
版本4.8.2
从我的ubuntu 14.04.1
机器交叉编译64位windows二进制文件和库。
我在交叉编译和测试我的项目和各种库时没有遇到任何问题:SDL2
、SDL2_image
、SDL2_mixer
、SDL2_ttf
、libfreetype
、libpng
、libjpeg
、libz
、libvorbis
、libogg
、bullet
、flite
、polyvox
、libnoise
。
但是,当我使用仅存在于较新版本的OpenGL
中的功能时,链接到OpenGL
会遇到问题。
首先,让我陈述一些先入为主的观点,如果我错了,请纠正我。
- 我链接到的
opengl32.a
(特别是/usr/x86_64-w64-mingw32/lib/libopengl32.a
,它来自ubuntu包mingw-w64-x86-64-dev
版本3.1.0-1
)来自mesa项目 -
这个
libopengl32.a
的目标是一个看起来很旧的OpenGL
版本。它包含glBegin
的功能定义$ nm /usr/x86_64-w64-mingw32/lib/libopengl32.a | grep ' glBegin$' 0000000000000000 T glBegin
但与
glCreateShader
相同的是没有匹配项。对于linux库
GL.so
,两者都有匹配项:$ readelf -Ws /usr/lib/nvidia-331/libGL.so | grep ' glCreateShader$|glBegin$' 2129: 000000000030eaa0 0 FUNC GLOBAL DEFAULT 17 glCreateShader 2312: 00000000002fe940 0 FUNC GLOBAL DEFAULT 17 glBegin
我的问题是是否:
-
我只是做错了事情。对于windows,所有
OpenGL
>1.1函数调用都必须通过扩展动态加载,而我已经被SDL2/SDL_opengl.h
和/或GL/glext
破坏了。如果是这种情况,为什么GL.so
具有用于所有OpenGL
函数的符号,而libopengl32.a
没有?而且,在使用OpenGL 4.0
函数时,我如何统一这一点,使我的代码不知道交叉编译? -
我必须从头开始从mesa源代码交叉编译
libopengl32.a
的新版本。(注:我甚至不确定libopengl32.a
是否来自台面项目) -
???
(完全是别的东西)
如果是这种情况,为什么GL.so有所有OpenGL函数的符号,而libopengl32.a没有?
因为有问题的特定实现的开发人员没有费心隐藏,即不将符号暴露在外部。OpenGL操作系统ABI只是指定哪些符号必须可用。它们没有指定可以不暴露其他符号。
我必须从头开始从mesa源代码交叉编译libopengl32.a的新版本。(注意:我甚至不确定libopengl32.a是否来自mesa项目)
不要这样做事实上,您根本不应该链接到OpenGL实现的特定版本(除非您想将该实现作为后备方案发布)。始终链接到某些通用接口规范。不要期望暴露指定的ABI(而不是API.ABI=应用程序二进制接口)之外的任何内容。对于Windows,这是OpenGL-1.1,对于Linux,目前是OpenGL-1.02。任何超出此范围的内容都只能通过扩展机制可靠地访问。
(完全是别的)
你可能想看看glloadgen(https://bitbucket.org/alfonse/glloadgen/wiki/Home),一组Lua脚本,它创建了一个严格定制的OpenGL接口加载程序。使用glloadgen
生成的代码,您根本不会链接到opengl32.lib
、libopen32.a
或libGL.so
。该库在运行时加载并解析所有符号,在很大程度上避免了混合加载环境中的所有麻烦。
- OpenGL 更新缓冲区如何影响速度
- 当对象在屏幕空间中较小时,OpenGL 更新缓慢
- OpenGL-缓冲区更新下一个渲染对象
- OpenGL-更新模型信息的最有效方法(例如模型矩阵)
- QT QML 中的 OpenGL,无法更新屏幕上的图像
- 翻译和比例后更新OpenGL立方体
- 如何使用 CUDA 内核更新 OpenGL VBO
- OpenGL + 无法使用缓冲区子数据更新缓冲区数据
- OpenGL 不会更新绘图视图
- 交叉编译 linux-->windows:使用 opengl32 获得更新的 OpenGL 支持.dll
- OpenGL/GLUT-更新几个窗口
- OpenGL窗口应用程序检查事件更新的频率
- OpenGL更新顶点阵列/缓冲区
- OpenGL更新部分VBO(点云)
- c++更新OpenGL/Glut窗口
- 如何使用Qt的QGLWidget准确更新OpenGL中的对象位置?
- 我如何确定为什么OpenGL入口点丢失后更新我的图形驱动程序
- QThread在GUI事件上调用glBufferData()时不更新OpenGL vbo和不渲染任何东西
- 不断更新Opengl窗口
- 安装Linux VMware 11 guestmesa驱动程序更新OpenGL