Undefined reference to WinMain (C++ MinGW)
Solution 1
This example code uses wWinMain
but
One thing to note is that Visual C++ supports a “wWinMain” entry point where the “lpCmdLine” parameter is a “LPWSTR”. You would typically use the “_tWinMain” preprocessor definition for your entry point and declare “LPTSTR lpCmdLine” so that you can easily support both ANSI and Unicode builds. However, the MinGW CRT startup library does not support wWinMain, so you’ll have to stick with the standard “WinMain” and use “GetCommandLine()” if you need to access command line arguments.
via Building Win32 GUI Applications with MinGW
In this specific case, you can use WinMain
instead. This program doesn't use pCmdLine
value, so it should compile when you change wWinMain
to WinMain
and PWSTR pCmdLine
to PSTR pCmdLine
.
If you later would need unicode command line use LPWSTR cmd_line = GetCommandLineW();
instead of WinMain
argument.
Newer Mingw versions also support -municode
linker option switching to alternate startup code allowing to use wWinMain
instead of WinMain
(or wmain
instead of main
). Add it to your command line, linker options in IDE or makefile.
g++ other_options_and_arguments -municode
Solution 2
The solution is to add -municode
to the compilation parameters, as mentioned by @ssbssa in a comment. (In the meantime, the accepted answer has been updated, and confirms this).
Example:
g++ helloworld3.cpp -o helloworld3 -Wl,-subsystem,windows -municode
See https://sourceforge.net/p/mingw-w64/wiki2/Unicode%20apps/
While it is not necessary to define _UNICODE or UNICODE to compile the above code, -municode is needed for linking because it uses wmain() instead of the traditional main().
Solution 3
I use mingw-w64 for Windows 10 (64 bit).
If you use this win32 example:
Change
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow);
to
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
then compile it with
gcc -O2 -Iinclude -std=c99 -D UNICODE -D _win32_IE=0x0500 -D WINVER=0x0500 hw.c -s -Wl,--subsystem,windows -municode -lcomctl32 -D WIN_32_LEAN_AND_MEAN -c
and link it with:
gcc hw.o
Solution 4
undefined reference to `WinMain'
It tries to find WinMain
and failed. So you need use WinMain
instead of wWinMain
.
Another possible issue is
error: conflicting declaration of C function 'int WinMain(HINSTANCE, HINSTANCE, PWSTR, int)' int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) ^~~~~~~ In file included from c:\mingw\include\windows.h:44:0, from test.cpp:5: c:\mingw\include\winbase.h:1263:14: note: previous declaration 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)' int APIENTRY WinMain (HINSTANCE, HINSTANCE, LPSTR, int);
So you need use LPSTR
instead of PWSTR
.
Then the entry point will like this:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow)
Above is ANSI version entry point.
![Admin](/assets/logo_square_200-5d0d61d6853298bd2a4fe063103715b4daf2819fc21225efa21dfb93e61952ea.png)
Admin
Updated on July 09, 2022Comments
-
Admin almost 2 years
Currently, I am trying to make a Windows application using C++. For compiling my program I use MinGW (GCC). But as soon as I use
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
instead ofint main()
the compiler shows me the following message:C:/mingw-w64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x2e): undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status The terminal process terminated with exit code: 1
The example code I tried to compile I got from this Windows application tutorial: Example Code
I have already tried reinstalling MinGW but it did not help (also I'm using Windows 10).
-
R1S8K about 3 years
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
you forgothPrevInstance