c++ - 交叉编译linux-->windows : Getting newer OpenGL support with opengl32. dll

标签 c++ opengl mingw cross-compiling

我正在使用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
    

我的问题是:

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

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

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

最佳答案

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.alibGL.so根本不。库会在运行时加载并解析所有符号,很大程度上避免了混合加载环境带来的所有麻烦。

关于c++ - 交叉编译linux-->windows : Getting newer OpenGL support with opengl32. dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26909202/

相关文章:

java - 渲染期间的高 CPU 负载

c++ - Open GL无法绘制一些三角形

c++ - 使用 DllMain 函数创建 Windows 共享库 (MinGW + CMake)

C++ - 使控制台全屏显示?

c - 用于 C 编译的特定 GCC 程序和库

c++ - 构造函数 MyClass(QWidget *parent = 0) 中 (QWidget *parent = 0) 的含义;

c++ - 如何在 Windows - Visual Studio 上用 C++ 将多个客户端连接到单个服务器?

opengl - JOGL/OpenGL : "\n" (newline) does not working for text rendering

c++ - 在 C++ 中使用 Cstrings 反转字符串

c++ - 取消引用共享指针并分配给它