在Linux上开发DirectX应用程序是否可行?

12

纯属兴趣,不过您能在Linux下编译DirectX应用程序吗?

显然,没有官方的软件开发工具包(SDK),但我在想是否可以通过Wine实现。

假设Wine有一个DirectX接口的实现以便运行游戏?是否可以链接该接口?(编辑:这称为winelib)

如果不能,也许可以使用mingw交叉编译器并在Wine下运行该应用程序。

这个问题我自问自答了一半,但不知道是否有人听说过类似的事情?

9个回答

11

我对此有些运气。我设法编译了这个简单的Direct3D示例

我在Ubuntu上使用wine库(wine-dev包)实现了这一点。感谢alastair向我指出了winelib。

我略微修改了源代码,将wchar转换为char(第52行的1和第55行的2,通过删除字符串文字前面的L)。可能有一种方法可以避免这种情况,但是这样做可以让它正常工作。

然后我用以下方式编译了源代码:

wineg++ -ld3d9 -ld3dx9 triangle.cpp

这将生成一个a.out.exe.so二进制文件,以及一个a.out脚本,在wine下运行该二进制文件。


在更现代的Ubuntu 22.04上,该软件包被称为libwine-dev - R A

4
如果这不是关于移植而是创建,您应该真正考虑OpenGL,因为这个API与DirectX一样强大,但更容易移植到Mac或Linux。
我不知道您的需求,最好提及一下。

2
由于Wine本质上是一个调用禁止器/翻译器,而不是一组可以链接的库,因此您无法针对Wine进行链接。如果Linux很重要,请使用OpenGL/SDL/OpenAL。

2

是的,这就是我提问时所考虑的内容。我会进一步调查。 - Nick

1

进入包含源代码的目录,然后输入以下内容:

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。


0

目前还没有直接将DirectX代码编译为Linux的方法。您可以像平常一样构建应用程序,然后使用Wine/Cedega等兼容层来运行它。


0

Wine是在Linux系统中运行DirectX的唯一途径。


0

你可以在Linux上编译DirectX应用程序,但不能直接启动它。 如果使用交叉编译器生成Windows可执行文件,并指向Windows SDK和DirectX SDK。


0

虽然这个问题有点过时了,但我决定更新一下它,因为它在这个特定的问题上一直是我的第一个建议。

正如之前的答案已经建议的那样,您可以针对winelib进行编译。然而,还有另外两种解决方案。

第一种解决方案是使用您的发行版提供的MinGW。MinGW是一个“交叉编译器”,它可以从macOS或Linux编译到Windows,并支持DirectX。请注意,使用MinGW编译的C++库与MSVC编译器的ABI不兼容,因此无法使用。但是,使用Wine可以执行生成的二进制文件。

第二种解决方案是使用clang作为交叉编译器。Clang通常包含所需的Windows编译器和链接器。但是,它需要您自己提供头文件和库。另一方面,使用这种方式编译的库与MSVC兼容,因此可以被其使用。

附注: 后者允许您使用Linux设置CI服务器(我在树莓派上这样做),为最终用户创建兼容的二进制文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接