在Linux上使用mingw交叉编译Direct3D [英] Cross compiling Direct3D on Linux with mingw

查看:199
本文介绍了在Linux上使用mingw交叉编译Direct3D的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何配置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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆