我正在使用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
时不知道交叉编译。功能?我必须交叉编译
libopengl32.a
的新版本从 mesa 源代码开始。 (注意:我什至不确定libopengl32.a
来自 mesa 项目)???
(完全是别的东西)
最佳答案
If this is the case, why does GL.so have symbols for all the OpenGL functions, while libopengl32.a does not?
因为相关特定实现的开发人员懒得隐藏,即不将符号暴露给外部。 OpenGL 操作系统 ABI 仅指定哪些符号必须可用。他们没有指定不得公开其他符号。
I have to cross-compile a newer version of libopengl32.a from scratch from the mesa source code. (note: I'm not even sure libopengl32.a comes from the mesa project)
不要这样做!事实上,您根本不应该链接到特定版本的 OpenGL 实现(除非您想将该实现作为后备)。始终链接到一些通用接口(interface)规范。切勿期望暴露指定 ABI(不是 API。ABI = 应用程序二进制接口(interface))之外的任何内容。对于 Windows 来说是 OpenGL-1.1,对于 Linux 目前是 OpenGL-1.2。只有通过扩展机制才能可靠地访问超出的任何内容。
??? (something else entirely)
您可能想看看 glloadgen ( https://bitbucket.org/alfonse/glloadgen/wiki/Home ),这是一组 Lua 脚本,它创建了一个紧密定制的 OpenGL 接口(interface)加载器。使用 glloadgen
生成的代码,您不会链接到 opengl32.lib
libopen32.a
或 libGL.so
根本不。库会在运行时加载并解析所有符号,很大程度上避免了混合加载环境带来的所有麻烦。
关于c++ - 交叉编译linux-->windows : Getting newer OpenGL support with opengl32. dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26909202/