提问人:Nick 提问时间:9/7/2008 最后编辑:Nick 更新时间:10/24/2020 访问量:8508
是否可以在 Linux 中开发 DirectX 应用程序?
Is it possible to develop DirectX apps in Linux?
问:
更多的是出于兴趣,但是您可以在 linux 下编译 DirectX 应用程序吗?
显然没有官方的SDK,但我认为葡萄酒可能是可能的。
想必 wine 有一个 DirectX 接口的实现来运行游戏?是否有可能与此链接?(编辑:这称为winelib)
如果做不到这一点,也许是一个 mingw 交叉编译器,应用程序在 wine 下运行。
一半在这里回答了我自己的问题,但想知道是否有人听说过这样的事情?
答:
目前无法将 DirectX 代码编译为直接面向 Linux。您可以像往常一样构建应用程序,然后使用兼容层(如 Wine/Cedega)运行它。
如果这不是关于移植而是创建,你真的应该考虑 OpenGL,因为这个 API 与 DirectX 一样强大,并且更容易移植到 Mac 或 Linux。
我不知道你的要求,所以最好提一下。
Wine 是在 Linux 中运行 DirectX 的唯一方法
你不能链接到 wine,因为它本质上是一个呼叫拦截器/转换器,而不是一组你可以挂钩的库。如果 linux 很重要,请选择 OpenGL/SDL/OpenAL。
您可以在 Linux 中编译 DirectX 应用程序,但不能立即启动它。 如果使用生成 Windows EXE 并指向 Windows SDK 和 DirectX SDK 的交叉编译器。
我相信(我从未尝试过)您可以针对 winelib 编译 Linux 二进制文件。因此,它的工作方式就像 Linux 可执行文件一样,但使用 Windows 库。
http://www.winehq.org/site/docs/winelib-guide/index
评论
我运气不错。我已经设法编译了这个简单的 Direct3D 示例。
我为此使用了 winelib(Ubuntu 上的 wine-dev 包)。感谢 alastair 将我指向 winelib。
我稍微修改了源代码以将 wchars 转换为字符(第 52 行为 1,第 55 行为 2,通过删除字符串文字之前的 L)。可能有办法解决这个问题,但这让它启动并运行。
然后,我用以下内容编译了源代码:
wineg++ -ld3d9 -ld3dx9 triangle.cpp
这将生成一个 a.out.exe.so 二进制文件,以及一个 a.out 脚本以在 wine 下运行它。
评论
libwine-dev
转到包含源的目录并输入:
winemaker --lower-uppercase -icomdlg32 -ishell32 -ishlwapi -iuser32 -igdi32 -iadvapi32 -ld3d9 .
make
wine yourexecutable.exe.so
如果您收到此错误:
main.c:95:5: error: ‘struct IDirect3D9’ has no member named ‘CreateDevice’
确保您已将文件命名为 main.cpp 而不是 main.c。
虽然这个问题已经过时了,但我决定更新它,因为它不断出现在我面前,作为这个特定问题的第一个建议。
正如前面的答案已经建议的那样,您可以针对 winelib 进行编译。但是,还有另外两种解决方案。
第一种解决方案是使用为发行版提供的 MinGW。MinGW是一个“交叉编译器”,可以从macOS或linux编译到Windows,并支持DirectX。请注意,使用 MinGW 编译的 C++ 库与 MSVC 编译器的 ABI 不兼容,因此无法使用。但是,生成的二进制文件可以使用 Wine 执行。
第二种解决方案是使用 clang 作为交叉编译器。Clang 通常包括 Windows 所需的现成编译器和链接器。但是,它需要您自己提供标头和库。另一方面,以这种方式编译的库与 MSVC 兼容,因此可以被 MSVC 使用。
旁注: 后者允许您使用 linux 设置 CI 服务器(我在树莓派上这样做了),它为最终用户创建兼容的二进制文件。
上一个:解密 C++ 模板错误消息
下一个:UDP 数据传递会损坏吗?
评论