在Linux上使用mingw交叉编译Direct3D [英] Cross compiling Direct3D on Linux with mingw
问题描述
如何配置mingw32来交叉编译Direct3D Apps for Windows?有什么可能吗?我实际上已成功编译了本教程中的代码: http://www.directxtutorial.com /Tutorial9/B-Direct3DBasics/dx9B4.aspx - 使用Kubuntu上的Code :: Blocks和i586-mingw32msvc-g ++。我需要添加 #define UNICODE
并删除 #pragma ...
零件来做到这一点,
但是,我无法从本教程中编译代码: www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B5.aspxrel =nofollow> http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B5.aspx
Mingw没有 d3dx9.h
文件。所以我已经安装了 wine1.2-dev
包与葡萄酒版本的Windows相关的头文件,但现在我有错误:
使用 #define UNICODE
:
--- ----------- Build:在d3d中调试---------------
i586-mingw32msvc-g ++ -Wall -g -I / usr / include / wine / windows -c /home/silmeth/programowanie/codeblocks/d3d/main.cpp -o obj / Debug / main.o
/ home / silmeth / programowanie / codeblocks / d3d / main。 cpp:在函数'int WinMain(HINSTANCE __ *,HINSTANCE __ *,CHAR *,int)':
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:50:error:invalid从'const wchar_t *'to'const WCHAR *'
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56:错误:从'const wchar_t *'到'const WCHAR *'的无效转换
/ (DWORD,const WCHAR *,const WCHAR *,DWORD,INT,INT,INT,INT,HWND __ *,...)的参数2的初始化参数2的初始化/ home / silmeth / programwanie / codeblocks / d3d / main.cpp: HMENU __ *,HINSTANCE __ *,void *)'
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56:错误:无效从const wchar_t *转换为const WCHAR *
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56:错误:初始化'HWND __ * CreateWindowExW(DWORD,const WCHAR *,const WCHAR *,DWORD,INT,INT,INT,INT,HWND__ *,HMENU __ *,HINSTANCE __ *,void *)'
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:在函数'void render_frame()':
/ home / silmeth / programowanie /codeblocks/d3d/main.cpp:158:warning:取地址临时
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:159:warning:取地址临时
/ home /silmeth/programowanie/codeblocks/d3d/main.cpp:160:警告:占用临时地址
进程以状态1(0分钟,0秒)终止
5个错误,3个警告
且没有 #define
:
-------------- Build:在d3d中调试------------- -
i586-mingw32msvc-g ++ -Wall -g -I / usr / include / wine / windows -c /home/silmeth/programowanie/codeblocks/d3d/main.cpp -o obj / Debug /main.o
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:在函数'int WinMain(HINSTANCE __ *,HINSTANCE __ *,CHAR *,int)':
/ home / silmeth /programowanie/codeblocks/d3d/main.cpp:50:错误:不能在赋值
/home/silmeth/programowanie/codeblocks/d3d/main.cpp中将'const wchar_t [12]'转换为'const CHAR *' :56:error:can not convert'const wchar_t *'to'const CHAR *'for argument'2'to'HWND __ * CreateWindowExA(DWORD,const CHAR *,const CHAR *,DWORD,INT,INT,INT,INT,HWND__ *,HMENU __ *,HINSTANCE __ *,void *)'
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:在函数'void render_frame()':
/ home / silmeth / programowanie /codeblocks/d3d/main.cpp:158:warning:取地址临时
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:159:warning:取地址临时
/ home /silmeth/programowanie/codeblocks/d3d/main.cpp:160:警告:取临时地址
进程以状态1(0分钟,0秒)终止
2个错误,3个警告
这是我试图编译的整个代码:
//包括基本的窗口头文件和Direct3D头文件
#define UNICODE //试图注释并取消注释
#include< windows.h>
#include< windowsx.h>
#include< d3d9.h>
#include< d3dx9.h>
//定义屏幕分辨率
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
//包括Direct3D库文件
/ /#pragma comment(lib,d3d9.lib)
//#pragma comment(lib,d3dx9.lib)
//全局声明
LPDIRECT3D9 d3d; //指向我们的Direct3D接口的指针
LPDIRECT3DDEVICE9 d3ddev; //指向设备类的指针
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; //指向顶点缓冲区的指针
//函数原型
void initD3D(HWND hWnd); //设置并初始化Direct3D
void render_frame(void); //渲染单个框架
void cleanD3D(void); //关闭Direct3D并释放内存
void init_graphics(void); // 3D declarations
struct CUSTOMVERTEX {FLOAT X,Y,Z; DWORD COLOR;};
#define CUSTOMFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)
// WindowProc函数原型
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
//任何Windows程序的入口点
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(& wc,sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.lpszClassName = LWindowClass;
RegisterClassEx(& wc);
hWnd = CreateWindowEx(NULL,LWindowClass,LOur Direct3D Program,
WS_OVERLAPPEDWINDOW,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,
NULL,NULL,hInstance,空值);
ShowWindow(hWnd,nCmdShow);
//设置并初始化Direct3D
initD3D(hWnd);
//输入主循环:
MSG msg;
while(TRUE)
{
while(PeekMessage(& msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage ; msg);
DispatchMessage(& msg);
}
if(msg.message == WM_QUIT)
break;
render_frame();
}
//清理DirectX和COM
cleanD3D();
return msg.wParam;
}
//这是程序的主消息处理程序
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
//此函数初始化并准备Direct3D以供使用
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9 D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(& d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
//使用此信息和d3dpp的信息创建设备类
d3d-> CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
& d3dpp,
& d3ddev);
init_graphics(); //调用函数初始化三角形
d3ddev-> SetRenderState(D3DRS_LIGHTING,FALSE); //关闭3D照明
}
//这是用于渲染单个框架的函数
void render_frame(void)
{
d3ddev-> Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
d3ddev-> BeginScene();
//选择我们使用的顶点格式
d3ddev-> SetFVF(CUSTOMFVF);
//设置管道
D3DXMATRIX matRotateY; //存储旋转信息的矩阵
static float index = 0.0f;指数+ = 0.05f; //一个不断增加的浮动值
//根据增加的浮动值建立一个矩阵来旋转模型
D3DXMatrixRotationY(& matRotateY,index);
//告诉Direct3D我们的矩阵
d3ddev-> SetTransform(D3DTS_WORLD,& matRotateY);
D3DXMATRIX matView; //视图转换矩阵
D3DXMatrixLookAtLH(& matView,
& D3DXVECTOR3(0.0f,0.0f,10.0f),//摄像机位置
& D3DXVECTOR3 (0.0f,0.0f,0.0f),//查找位置
& D3DXVECTOR3(0.0f,1.0f,0.0f)); //向上方向
d3ddev-> SetTransform(D3DTS_VIEW,& matView); //设置视图转换为matView
D3DXMATRIX matProjection; //投影变换矩阵
D3DXMatrixPerspectiveFovLH(& matProjection,
D3DXToRadian(45),//水平视野
(FLOAT)SCREEN_WIDTH /(FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f,// near near-plane
100.0f); // far far-plane
d3ddev-> SetTransform(D3DTS_PROJECTION,& matProjection); //设置投影
//选择要显示的顶点缓冲区
d3ddev-> SetStreamSource(0,v_buffer,0,sizeof(CUSTOMVERTEX));
//将顶点缓冲区复制到后台缓冲区
d3ddev-> DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
d3ddev-> EndScene();
d3ddev-> Present(NULL,NULL,NULL,NULL);
}
//这是清除Direct3D和COM的函数
void cleanD3D(void)
{
v_buffer-> ;发布(); //关闭并释放顶点缓冲区
d3ddev-> Release(); //关闭并释放3D设备
d3d-> Release(); //关闭和释放Direct3D
}
//这是将3D模型放入视频RAM的函数
void init_graphics(void)
{
//使用CUSTOMVERTEX结构创建顶点
CUSTOMVERTEX vertices [] =
{
{3.0f,-3.0f,0.0f,D3DCOLOR_XRGB(0,0,255 ),},
{0.0f,3.0f,0.0f,D3DCOLOR_XRGB(0,255,0),},
{-3.0f,-3.0f,0.0f,D3DCOLOR_XRGB ,0),},
};
//创建一个名为v_buffer的顶点缓冲接口
d3ddev-> CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
& v_buffer,
NULL);
VOID * pVoid; // a void pointer
//锁定v_buffer并将顶点加载到它
v_buffer-> Lock(0,0,(void **)& pVoid,0);
memcpy(pVoid,vertices,sizeof(vertices));
v_buffer-> Unlock();
}
我必须通过MS DirectX SDK安装吗?用代码更改一些东西?我是DirectX和Windows相关的事情noob,但我只是想交叉编译一些简单的例子D3D,并检查这是否工作。
好的!我最终成功了!
不幸的是,我需要下载Microsoft DirectX SDK(2007年4月)(我不能安装更新的葡萄酒)。
然后我不得不安装MinGW使用wine和安装mingw-utils 0.3(我得到reimp.exe文件)。
然后我在葡萄酒的注册中设置PATH到 C:\windows; C:\windows \system; C:\MinGW\bin
然后我创建了 wine reimp.exeC:\Program Files \Microsoft DirectX SDK(2007年4月)/Lib/x86/d3dx9.lib
。此命令生成 d3dx9_33.a
文件,我将其更改为 d3dx9.a
,并将其放在 / usr / i586-mingw32msvc / lib /
。
我还将所有缺少的头文件从DirectX SDK复制到
/ usr / i586-mingw32msvc / include
。 然后...我编译程序,链接到libd3d9.a好的消息是,可以在Linux下使用Linux版本的MinGW编译Windows DirectX程序。
坏消息:需要使用葡萄酒安装几个MinGW实用程序和整个MS DX SDK。
EDIT
还有一件事:我需要手动制作所有WCHAR *相关的铸件 - 如果没有完成,mingw会报错。 Goz在这里很有帮助。
How to configure mingw32 to cross-compile Direct3D Apps for Windows? Is there any possibility? I have actually succeeded compiling code from this tutorial: http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B4.aspx - using Code::Blocks on Kubuntu with i586-mingw32msvc-g++. I needed to add #define UNICODE
and remove the #pragma ...
parts to do this, and I used header files from /usr/i586-mingw32msvc/include and libs also from mingw package.
However I cannot compile code from this tutorial: http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B5.aspx
Mingw doesn't have d3dx9.h
file. So I've installed wine1.2-dev
package with wine versions of Windows-related header files, but now I have errors:
With #define UNICODE
:
-------------- Build: Debug in d3d ---------------
i586-mingw32msvc-g++ -Wall -g -I/usr/include/wine/windows -c /home/silmeth/programowanie/codeblocks/d3d/main.cpp -o obj/Debug/main.o
/home/silmeth/programowanie/codeblocks/d3d/main.cpp: In function ‘int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)’:
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:50: error: invalid conversion from ‘const wchar_t*’ to ‘const WCHAR*’
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56: error: invalid conversion from ‘const wchar_t*’ to ‘const WCHAR*’
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56: error: initializing argument 2 of ‘HWND__* CreateWindowExW(DWORD, const WCHAR*, const WCHAR*, DWORD, INT, INT, INT, INT, HWND__*, HMENU__*, HINSTANCE__*, void*)’
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56: error: invalid conversion from ‘const wchar_t*’ to ‘const WCHAR*’
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56: error: initializing argument 3 of ‘HWND__* CreateWindowExW(DWORD, const WCHAR*, const WCHAR*, DWORD, INT, INT, INT, INT, HWND__*, HMENU__*, HINSTANCE__*, void*)’
/home/silmeth/programowanie/codeblocks/d3d/main.cpp: In function ‘void render_frame()’:
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:158: warning: taking address of temporary
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:159: warning: taking address of temporary
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:160: warning: taking address of temporary
Process terminated with status 1 (0 minutes, 0 seconds)
5 errors, 3 warnings
And without the #define
:
-------------- Build: Debug in d3d ---------------
i586-mingw32msvc-g++ -Wall -g -I/usr/include/wine/windows -c /home/silmeth/programowanie/codeblocks/d3d/main.cpp -o obj/Debug/main.o
/home/silmeth/programowanie/codeblocks/d3d/main.cpp: In function ‘int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)’:
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:50: error: cannot convert ‘const wchar_t [12]’ to ‘const CHAR*’ in assignment
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:56: error: cannot convert ‘const wchar_t*’ to ‘const CHAR*’ for argument ‘2’ to ‘HWND__* CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, INT, INT, INT, INT, HWND__*, HMENU__*, HINSTANCE__*, void*)’
/home/silmeth/programowanie/codeblocks/d3d/main.cpp: In function ‘void render_frame()’:
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:158: warning: taking address of temporary
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:159: warning: taking address of temporary
/home/silmeth/programowanie/codeblocks/d3d/main.cpp:160: warning: taking address of temporary
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 3 warnings
Here is the whole code I'm trying to compile:
// include the basic windows header files and the Direct3D header file
#define UNICODE //tried to comment and uncomment this
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#include <d3dx9.h>
// define the screen resolution
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
// include the Direct3D Library files
//#pragma comment (lib, "d3d9.lib")
//#pragma comment (lib, "d3dx9.lib")
// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; // the pointer to the vertex buffer
// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory
void init_graphics(void); // 3D declarations
struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"WindowClass";
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL, L"WindowClass", L"Our Direct3D Program",
WS_OVERLAPPEDWINDOW, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
// set up and initialize Direct3D
initD3D(hWnd);
// enter the main loop:
MSG msg;
while(TRUE)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message == WM_QUIT)
break;
render_frame();
}
// clean up DirectX and COM
cleanD3D();
return msg.wParam;
}
// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
// create a device class using this information and the info from the d3dpp stuct
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
init_graphics(); // call the function to initialize the triangle
d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); // turn off the 3D lighting
}
// this is the function used to render a single frame
void render_frame(void)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
// select which vertex format we are using
d3ddev->SetFVF(CUSTOMFVF);
// SET UP THE PIPELINE
D3DXMATRIX matRotateY; // a matrix to store the rotation information
static float index = 0.0f; index+=0.05f; // an ever-increasing float value
// build a matrix to rotate the model based on the increasing float value
D3DXMatrixRotationY(&matRotateY, index);
// tell Direct3D about our matrix
d3ddev->SetTransform(D3DTS_WORLD, &matRotateY);
D3DXMATRIX matView; // the view transform matrix
D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 0.0f, 10.0f), // the camera position
&D3DXVECTOR3 (0.0f, 0.0f, 0.0f), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction
d3ddev->SetTransform(D3DTS_VIEW, &matView); // set the view transform to matView
D3DXMATRIX matProjection; // the projection transform matrix
D3DXMatrixPerspectiveFovLH(&matProjection,
D3DXToRadian(45), // the horizontal field of view
(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f, // the near view-plane
100.0f); // the far view-plane
d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection
// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
// copy the vertex buffer to the back buffer
d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
v_buffer->Release(); // close and release the vertex buffer
d3ddev->Release(); // close and release the 3D device
d3d->Release(); // close and release Direct3D
}
// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
// create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX vertices[] =
{
{ 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 0.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
};
// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);
VOID* pVoid; // a void pointer
// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();
}
Do I have to install through wine MS DirectX SDK? Change something with the code? I'm DirectX- and Windows-related things noob but I just want to cross-compile some simple examples of D3D and check if this works.
Ok! I've finally succeeded!
Unfortunately, I needed to download Microsoft DirectX SDK (April 2007) (I couldn't install newer ones with wine).
Then I had to install MinGW using wine and also install mingw-utils 0.3 (I had to obtain reimp.exe file).
Then I set up PATH in wine's register to C:\windows;C:\windows\system;C:\MinGW\bin
Then I made wine reimp.exe "C:\Program Files\Microsoft DirectX SDK (April 2007)/Lib/x86/d3dx9.lib"
. This command generated d3dx9_33.a
file, I've changed it to d3dx9.a
and put it in /usr/i586-mingw32msvc/lib/
.
I have also copied all lacking header files from DirectX SDK to /usr/i586-mingw32msvc/include
.
And then... I compiled the program, linking it to libd3d9.a and libd3dx9.a, and it compiled, linked, and it WORKS!
So the good news is: one can compile Windows DirectX programs under Linux using Linux version of MinGW.
The bad news: one need to install a few MinGW utilities and whole MS DX SDK using wine.
EDIT
And one more thing: I needed to make all WCHAR*-related castings manually - mingw shouts with errors if it isn't done. Goz was helpful here.
这篇关于在Linux上使用mingw交叉编译Direct3D的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!