News:

When registered with our forums, feel free to send a "here I am" post here to differ human beings from SPAM bots.

Main Menu

How to enable win32 compilation for mingw32?

Started by lucky7456969, April 04, 2014, 09:26:01 AM

Previous topic - Next topic

lucky7456969

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.

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

EnterTheNameHere

#1
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.


lucky7456969

#3
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


#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;
}

EnterTheNameHere

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.

lucky7456969