纯属兴趣,不过您能在Linux下编译DirectX应用程序吗?
显然,没有官方的软件开发工具包(SDK),但我在想是否可以通过Wine实现。
假设Wine有一个DirectX接口的实现以便运行游戏?是否可以链接该接口?(编辑:这称为winelib)
如果不能,也许可以使用mingw交叉编译器并在Wine下运行该应用程序。
这个问题我自问自答了一半,但不知道是否有人听说过类似的事情?
我对此有些运气。我设法编译了这个简单的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下运行该二进制文件。
进入包含源代码的目录,然后输入以下内容:
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。
目前还没有直接将DirectX代码编译为Linux的方法。您可以像平常一样构建应用程序,然后使用Wine/Cedega等兼容层来运行它。
你可以在Linux上编译DirectX应用程序,但不能直接启动它。 如果使用交叉编译器生成Windows可执行文件,并指向Windows SDK和DirectX SDK。
虽然这个问题有点过时了,但我决定更新一下它,因为它在这个特定的问题上一直是我的第一个建议。
正如之前的答案已经建议的那样,您可以针对winelib进行编译。然而,还有另外两种解决方案。
第一种解决方案是使用您的发行版提供的MinGW。MinGW是一个“交叉编译器”,它可以从macOS或Linux编译到Windows,并支持DirectX。请注意,使用MinGW编译的C++库与MSVC编译器的ABI不兼容,因此无法使用。但是,使用Wine可以执行生成的二进制文件。
第二种解决方案是使用clang作为交叉编译器。Clang通常包含所需的Windows编译器和链接器。但是,它需要您自己提供头文件和库。另一方面,使用这种方式编译的库与MSVC兼容,因此可以被其使用。
附注: 后者允许您使用Linux设置CI服务器(我在树莓派上这样做),为最终用户创建兼容的二进制文件。
libwine-dev
。 - R A