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

Cross-compiling linux-->windows: Getting newer OpenGL support with opengl32.dll

本文关键字:更新 OpenGL dll 支持 opengl32 使用 linux-- gt windows 交叉编译      更新时间:2023-10-16

我使用x86_64-w64-mingw32工具集和gcc版本4.8.2从我的ubuntu 14.04.1机器交叉编译64位windows二进制文件和库。

我在交叉编译和测试我的项目和各种库时没有遇到任何问题:SDL2SDL2_imageSDL2_mixerSDL2_ttflibfreetypelibpnglibjpeglibzlibvorbisliboggbulletflitepolyvoxlibnoise

但是,当我使用仅存在于较新版本的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
    

我的问题是是否:

  1. 我只是做错了事情。对于windows,所有OpenGL>1.1函数调用都必须通过扩展动态加载,而我已经被SDL2/SDL_opengl.h和/或GL/glext破坏了。如果是这种情况,为什么GL.so具有用于所有OpenGL函数的符号,而libopengl32.a没有?而且,在使用OpenGL 4.0函数时,我如何统一这一点,使我的代码不知道交叉编译?

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

  3. ???(完全是别的东西)

如果是这种情况,为什么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.liblibopen32.alibGL.so。该库在运行时加载并解析所有符号,在很大程度上避免了混合加载环境中的所有麻烦。