对 WinMain 的未定义引用 (C++ MinGW)

Undefined reference to WinMain (C++ MinGW)

目前,我正在尝试使用 C++ 制作一个 Windows 应用程序。为了编译我的程序,我使用 MinGW (GCC)。但是,一旦我使用 int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 而不是 int main(),编译器就会显示以下消息:

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

我尝试编译的示例代码是从 Windows 应用教程中获得的: Example Code

我已经尝试重新安装 MinGW,但它没有帮助(而且我正在使用 Windows 10)。

undefined reference to `WinMain'

它试图找到 WinMain 但失败了。所以你需要使用 WinMain 而不是 wWinMain.

另一个可能的问题是

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);

所以你需要使用 LPSTR 而不是 PWSTR

那么入口点会是这样的:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow)

以上是 ANSI 版本入口点。

此示例代码使用 wWinMain

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.

通过Building Win32 GUI Applications with MinGW

在这种特定情况下,您可以改用 WinMain。该程序不使用 pCmdLine 值,因此当您将 wWinMain 更改为 WinMain 并将 PWSTR pCmdLine 更改为 PSTR pCmdLine.

时应该可以编译

如果您以后需要 unicode 命令行,请使用 LPWSTR cmd_line = GetCommandLineW(); 而不是 WinMain 参数。

较新的 Mingw 版本还支持 -municode 链接器选项切换到备用启动代码,允许使用 wWinMain 而不是 WinMain(或 wmain 而不是 main).将它添加到您的命令行,IDE 或 makefile 中的链接器选项。

g++ other_options_and_arguments -municode

解决方法是在编译参数中添加-municode,正如@ssbssa在评论中提到的。 (同时,已接受的答案已更新,并证实了这一点)。

示例:

g++ helloworld3.cpp -o helloworld3 -Wl,-subsystem,windows -municode

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().

我将 mingw-w64 用于 Windows 10(64 位)。

如果你用这个win32 example:

改变

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)

然后用

编译
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 

和link它与:

gcc hw.o

我正在使用 vscode,我的问题的答案是:

  1. 打开设置
  2. 搜索保存
  3. 在运行
  4. 之前启用保存文件

终端将正常工作