Author Topic: How to enable win32 compilation for mingw32?  (Read 8051 times)

Offline lucky7456969

  • Multiple posting newcomer
  • *
  • Posts: 33
How to enable win32 compilation for mingw32?
« on: April 04, 2014, 09:26:01 am »
Ha ha, it is me again.
I wonder how do I enable win32 compilation in mingw32.
Sorry, it's a bit off-topic.
I am getting this when I try to compile a windows program while mingw32 is targeted at a 16-bit windows program.

I am looking for a switch name basically.
Code
C:\Program Files (x86)\CodeBlocks\MinGW\lib\libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `WinMain@16'
Thanks for helping in advance
Jack

Offline EnterTheNameHere

  • Multiple posting newcomer
  • *
  • Posts: 19
Re: How to enable win32 compilation for mingw32?
« Reply #1 on: April 04, 2014, 12:21:12 pm »
Just a note, can You post the code You are compiling (minimal functional) and build log can be helpful too. It helps us to guess where the problem might be.
« Last Edit: April 04, 2014, 12:50:18 pm by EnterTheNameHere »


Offline lucky7456969

  • Multiple posting newcomer
  • *
  • Posts: 33
Re: How to enable win32 compilation for mingw32?
« Reply #3 on: April 04, 2014, 12:53:55 pm »
Hi there,
Actually, there isn't nothing special in my program. I just generated a DirectX project off the wizard.
Maybe the wWinMain is causing the problem. I didn't use a main() method anyways.
BTW, I dropped in all the lib files of DirectX (x86) version, and all the .a files inside the mingw directory
if that matters.
Thanks a lot
Jack

Code
#include <d3d9.h>
#include <strsafe.h>

LPDIRECT3D9         g_pD3D = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; // Our rendering device

HRESULT InitD3D( HWND hWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    return S_OK;
}

VOID Cleanup()
{
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}

VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here

        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc =
    {
        sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,
        GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
        L"D3D Tutorial", NULL
    };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              NULL, NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        // Enter the message loop
        MSG msg;
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    UnregisterClass( L"D3D Tutorial", wc.hInstance );
    return 0;
}
« Last Edit: April 04, 2014, 02:06:55 pm by lucky7456969 »

Offline EnterTheNameHere

  • Multiple posting newcomer
  • *
  • Posts: 19
Re: How to enable win32 compilation for mingw32?
« Reply #4 on: April 04, 2014, 04:24:08 pm »
Hmm, the wizard generates code which uses unicode, but it doesn't define UNICODE nor _UNICODE (svn build). wWinMain (or wmain) are unicode versions of application entry points, which are non-standard (I guess). GCC is by default looking for int main or int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ), so it can't find either of these. Mingw-w64 has support for wmain and wWinMain( LPWSTR in 3rd param ), so You could try adding "-municode" into Build Options -> Linker settings - Other linker options and try to compile.

If it ends with error: unrecognized command line option "-municode"! then You can either try getting newer compiler or use non-unicode int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) version of the function, but then you might want to load command line parameters with GetCommandLineW WINAPI function.

Offline lucky7456969

  • Multiple posting newcomer
  • *
  • Posts: 33
Re: How to enable win32 compilation for mingw32?
« Reply #5 on: April 05, 2014, 06:48:50 am »
I followed this thread here. And it's all great. Works perfectly!
Thanks for helping

http://stackoverflow.com/questions/3571250/wwinmain-unicode-and-mingw