OpenGL + Mesa 3D + MinGW

Posted

技术标签:

【中文标题】OpenGL + Mesa 3D + MinGW【英文标题】: 【发布时间】:2010-01-01 19:52:39 【问题描述】:

我在 (Ubuntu) Linux 上编写 C++ 应用程序并将它们编译到 2 个操作系统:使用“g++”(GNU C++ 编译器)本地编译到 Linux 并将它们交叉编译到 Windows 通过使用“i386-mingw32-g++”(MinGW C++ 交叉编译器)。

现在,我正在尝试交叉编译“OpenGL”应用程序(从 Linux 到 Windows)——为此我需要一些 OpenGL 库文件。 作为 OpenGL 的实现,我使用“Mesa 3D”开源库。幸运的是,Ubuntu 为 Linux 提供了“预编译”的 mesa3d 库(libgl1-mesa-devlibglu1-mesa-dev),但不幸的是,没有任何预编译的库可供使用使用 MinGW 交叉编译器(因此是它们的 Windows 版本) - 所以我“必须”“从源代码”手动编译它们(可以从 http://www.mesa3d.org 主页下载)。

但我不知道这样做。在 mesa3d 源代码中,有一些文档如何为某些特定平台构建库 - 特别是“README.MINGW32”自述文件。 但就在第一行有一些命令

mingw32-make -f Makefile.mgw [OPTIONS...]

我无法运行,因为我没有安装任何“mingw32-make”程序。通过其他软件,我曾经用“经典”构建它们

./configure -> make -> make install

程序,但这不适用于 mesa3d 库。 比如我也试过

./configure --host=i386-mingw32

它已经配置好了,但是在输入之后

make

它抛出了一些错误

error: #error No PIPE_SUBSYSTEM_WINDOWS_xxx subsystem defined.

现在我迷路了 :-( .

那么有人知道如何构建 mesa3d 库以将它们与 mingw32 一起使用吗?

P.S.:当然,我不想再使用 Microsoft Visual Studio :-) 。而且我还想做所有必需的事情来从 Linux 构建 OpenGL 环境并使用 mingw32 进行交叉编译。我希望这是可能的。

P.S.2:在http://www.mesa3d.org/systems.html 页面上写着“不推荐使用”带有 Mesa 3D 的 MinGW。我就是这样使用它的正确方法?

【问题讨论】:

只是想知道... OpenGL 通常用于访问硬件加速的 3D。通过在 windows 上使用 mesa,您可以在 windows 上使用软件实现。这真的是你想要的吗?否则,您只需要使用 windows 提供的 opengl 库即可。 我的主要目标是在编写 c++ 代码时“独立于架构” -> 因此我认为使用跨平台库(在本例中为“mesa3d”)是实现这一目标的好方法,我不知道,也许我错了。所以我应该理解它,以便在“每个 Windows”中都有一些实现 OpenGL 的“库”,当我在我的 Linux 机器上编写一些 OpenGL 代码时,我不需要在我的程序中分发任何额外的 OpenGL 库?如果是这样,那是哪些库 - “opengl.dll”、“libopengl.lib”还是什么? OpenGL 通常作为平台的一部分公开。对于 Windows,Microsoft 一直在其平台 SDK 中提供 OpenGL 接口 (opengl.lib)。我不确定你究竟是如何为 mingw 链接器构建 .a 的,但它与使用 mesa 绝对不同。 Mesa 本身就是一个软件实现。在 GNU/Linux 上,除了软件实现之外,它还包括 DRI(直接渲染接口),它允许为 GL 编写硬件加速驱动程序。 【参考方案1】:

没有必要为 MinGW 编译 Mesa3D。 MinGW 包含 GL 库;它只是不叫libGL.a 也不叫libGLU.a;这些库被称为libopengl32.alibglu32.a。遗憾的是,这是微软决定在 Visual Studio 上的 Windows 下调用它们的名称,因此 MinGW 的 Windows 和 GNU/Linux 版本都决定包含上述命名的库。

所以,当为 Windows 进行交叉编译时,只需更改:

-lGL -lGLU

进入

-lopengl32 -lglu32

GNU/Linux 上的 Mesa3D 实际上是 OpenGL 的 libre 实现的名称。这是因为 OpenGL 是商标,而 SGI 的政策不允许任何人在不支付巨额资金的情况下使用该名称。尽管如此,SGI 还是为作者 Brian Paul 提供了测试套件的副本。

Mesa3D 在大多数平台上都具有原生 OpenGL 实现,称为软件“健全性检查”库,可模拟大量仅限硬件的高端功能。但在 GNU/Linux 上,更重要的是称为 DRI 或直接渲染接口的东西。这是真正的交易,硬件加速等等。这个库也称为 Mesa3D;事实上,DRI 的配置是 Mesa3D 以及 X11 和内核的一部分。

Mesa3D 在 GNU/Linux 和其他免费平台上提供 libre OpenGL 兼容的头文件。

总结: Mesa3D 是 OpenGL 的 GNU/Linux 实现的名称,因为该名称已注册商标。这个库包括一个优秀的、有特色的、正确的和相对快速的软件实现。它还包括用于硬件加速的直接渲染接口。

【讨论】:

非常感谢。顺便说一句,我在 Linux 上拥有的“本机”gcc 中是否还有预编译的库,或者在为 Linux 编译时是否必须使用 mesa3d 库? 没有“MinGW 的 GNU/Linux 发行版”之类的东西。它们是两个不同的东西。 MinGW 从各个角度看起来都一样。 @rubenvb 既然你清楚我的意思,为什么还要吹毛求疵? 在当前(sep'13)版本的 MINGW 中仍然是这种情况吗?我正在浏览 MINGW 的安装管理器,但在其中找不到 OpenGL 库。 @Bram 我不会检查可用软件包的列表,因为我不是每天都在运行 Windows。但考虑到自 Windows 95 以来 OpenGL 一直是 Windows 的一部分,我认为 2013 年 9 月 OpenGL 并没有突然开始作为一个单独的库包出现。它应该包含在 MinGW 安装程序提供的任何 Win32 API 支持包中。每当我安装 MinGW 或包含 MinGW 的 IDE 时,opengl32glu32 总是已经存在。

以上是关于OpenGL + Mesa 3D + MinGW的主要内容,如果未能解决你的问题,请参考以下文章

Linux OpenGL 实践篇-1

RK3399应用开发 | 编译安装 mesa 3D 图形库(23.0.0)

RK3399应用开发 | 编译安装 mesa 3D 图形库(23.0.0)

如何让这段代码在 Mesa3d 上运行?

Mesa 17.0.1 说 OpenGL Core 4.5 即使我的 Intel HD 520 显卡仅支持 4.4

OpenGL2.0及以上版本中gl,glut,glew,glfw,mesa等部件的关系