我正在使用x86_64-w64-mingw32
工具集,gcc
版本4.8.2
来交叉编译来自ubuntu 14.04.1
计算机的64位Windows二进制文件和库。
我交叉编译和测试我的项目和各种库时没有问题:SDL2
,SDL2_image
,SDL2_mixer
,SDL2_ttf
,{{1} },libfreetype
,libpng
,libjpeg
,libz
,libvorbis
,libogg
,bullet
,flite
, polyvox
。
但是,当我使用仅存在于libnoise
的较新版本中的功能时,我遇到与OpenGL
相关联的问题。
首先,请允许我说出一些先入为主的观点,如果我错了,请纠正我。
OpenGL
我(来自ubuntu包opengl32.a
版本/usr/x86_64-w64-mingw32/lib/libopengl32.a
的{{1}})。 此mingw-w64-x86-64-dev
定位的3.1.0-1
版本看起来很旧。它包含libopengl32.a
OpenGL
但glBegin
的相同内容没有匹配。
使用linux库$ nm /usr/x86_64-w64-mingw32/lib/libopengl32.a | grep ' glBegin$'
0000000000000000 T glBegin
,两者都匹配:
glCreateShader
我的问题是:是否:
我只是做错了。对于Windows,所有GL.so
> 1.1函数调用必须通过扩展动态加载,并且我被$ 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
和/或OpenGL
宠坏了。如果是这种情况,为什么SDL2/SDL_opengl.h
包含所有GL/glext
函数的符号,而GL.so
则没有?而且,在使用OpenGL
函数时,如何统一这一点以便我的代码不会发现交叉编译?
我必须从mesa源代码中从头开始交叉编译更新版本的libopengl32.a
。 (注意:我甚至不确定OpenGL 4.0
来自台面项目)
libopengl32.a
(完全不同于其他内容)
答案 0 :(得分:2)
如果是这种情况,为什么GL.so有所有OpenGL函数的符号,而libopengl32.a没有?
因为有问题的特定实现的开发人员不愿意隐藏,即不将符号暴露给外部。 OpenGL操作系统ABI只指定哪些符号必须可用。它们没有规定可能不会暴露其他符号。
我必须从mesa源代码中从头开始交叉编译更新版本的libopengl32.a。 (注意:我甚至不确定libopengl32.a是否来自mesa项目)
不要这样做!实际上你根本不应该链接特定版本的OpenGL实现(除非你想把这个实现作为后备发送)。始终链接到一些通用接口规范。永远不要指望暴露指定ABI之外的任何东西(不是API.ABI =应用程序二进制接口)。适用于OpenGL-1.1的Windows,适用于Linux的OpenGL-1.2。只有通过扩展机制才能可靠地访问任何其他内容。
??? (完全不同的东西)
您可能需要查看glloadgen(https://bitbucket.org/alfonse/glloadgen/wiki/Home),这是一组Lua脚本,可以创建一个紧密定制的OpenGL接口加载器。使用glloadgen
生成的代码,您根本不会与opengl32.lib
libopen32.a
或libGL.so
相关联。加载库并在运行时解析所有符号,这很大程度上避免了从混合加载环境中获得的所有麻烦。