交叉编译linux - > windows:使用opengl32.dll获得更新的OpenGL支持

时间:2014-11-13 12:45:20

标签: c++ opengl mingw cross-compiling

我正在使用x86_64-w64-mingw32工具集,gcc版本4.8.2来交叉编译来自ubuntu 14.04.1计算机的64位Windows二进制文件和库。

我交叉编译和测试我的项目和各种库时没有问题:SDL2SDL2_imageSDL2_mixerSDL2_ttf,{{1} },libfreetypelibpnglibjpeglibzlibvorbisliboggbulletflitepolyvox

但是,当我使用仅存在于libnoise的较新版本中的功能时,我遇到与OpenGL相关联的问题。

首先,请允许我说出一些先入为主的观点,如果我错了,请纠正我。

  • {i}项链接到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

我的问题是:是否:

  1. 我只是做错了。对于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函数时,如何统一这一点以便我的代码不会发现交叉编译?

  2. 我必须从mesa源代码中从头开始交叉编译更新版本的libopengl32.a。 (注意:我甚至不确定OpenGL 4.0来自台面项目)

  3. libopengl32.a(完全不同于其他内容)

1 个答案:

答案 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.alibGL.so相关联。加载库并在运行时解析所有符号,这很大程度上避免了从混合加载环境中获得的所有麻烦。