Make sure you have installed MinGW on Linux:
sudo apt install mingw-w64 gdb-mingw-w64
Optionally, for testing purpose, install also WINE:
wine-stable wine-development wine64 wine64-development
FYI, with my recent mingw32 installation, the location for needed DLL files are in :
/usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/
ll /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/*.dll
-rwxr-xr-x 1 root root 482339 Mar 12 2018 /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libatomic-1.dll*
-rwxr-xr-x 1 root root 1190750 Mar 12 2018 /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libgcc_s_seh-1.dll*
-rwxr-xr-x 1 root root 1523015 Mar 12 2018 /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libgomp-1.dll*
-rwxr-xr-x 1 root root 1393636 Mar 12 2018 /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libquadmath-0.dll*
-rwxr-xr-x 1 root root 387526 Mar 12 2018 /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libssp-0.dll*
-rwxr-xr-x 1 root root 16229690 Mar 12 2018 /usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/libstdc++-6.dll*
(this path should be added into PATH to make wine able to run our compiled EXE)
Example of Makefile:
APP=MyGUI
CC=x86_64-w64-mingw32-g++
WRC=x86_64-w64-mingw32-windres
$(APP).exe : $(APP).o $(APP).res
$(CC) -mwindows $(APP).o $(APP).res -o $@
$(APP).o: $(APP).c
$(CC) -mwindows -c -o $@ $<
$(APP).res : resource.rc resource.h
$(WRC) $< -O coff -o $@
clean:
rm *.res *.o $(APP).exe
The Source code:
/*-------------------------------------------------*/
/* MyGUI.c - gui hello world */
/* build: gcc -mwindows MyGUI.c -o MyGUI.exe */
/*-------------------------------------------------*/
#include <windows.h>
char glpszText[1024];
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/******************************************************************************
* Main entry
******************************************************************************/
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
wsprintf(glpszText,
"Hello World\nGetCommandLine(): [%s]\n"
"WinMain lpCmdLine: [%s]\n",
lpCmdLine, GetCommandLine() );
WNDCLASSEX wcex;
wcex.cbSize = sizeof(wcex);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc; /* set the callback */
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "MYGUI";
wcex.hIconSm = NULL;
if (!RegisterClassEx(&wcex))
return FALSE;
HWND hWnd;
hWnd = CreateWindow("MYGUI", "MyGUI", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
/* main loop */
while (GetMessage(&msg, NULL, 0, 0))
{
/* we can intercept keystrokes here too if we want */
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
/******************************************************************************
* Main callback
******************************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, glpszText, strlen(glpszText), &rt, DT_TOP | DT_LEFT);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
/* for everything else unhandled, do this */
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
To run:
wine64 MyGUI.exe
If we find issue that WINE could not find some MinGW's *.dll, create soft links in WINE's system directory to the MinGW's dll:
pushd ~/.wine/drive_c/windows/system
cp -s /usr/lib/gcc/i686-w64-mingw32/7.3-win32/*.dll .
popd
To debug the EXE:
i686-w64-mingw32-gdb <EXE code>