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

27

目前,我正在尝试使用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应用程序教程:

示例代码

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


1
https://learn.microsoft.com/en-us/windows/win32/learnwin32/prepare-your-development-environment - stark
5个回答

18
较新的Mingw版本支持-municode链接器选项,可以切换到替代的启动代码,从而可以使用wWinMain代替WinMain(或者wmain代替main)。将其添加到命令行、IDE中的链接器选项或makefile中。
g++ other_options_and_arguments -municode

旧版本不支持此选项。
需要注意的一点是,Visual C++ 支持“wWinMain”入口点,其中“lpCmdLine”参数是“LPWSTR”。通常情况下,您会使用“_tWinMain”预处理器定义作为入口点,并声明“LPTSTR lpCmdLine”,以便可以轻松支持 ANSI 和 Unicode 构建。然而,MinGW CRT 启动库不支持 wWinMain,因此您必须坚持使用标准的 “WinMain”,如果需要访问命令行参数,则使用 “GetCommandLine()”。
通过 使用 MinGW 构建 Win32 GUI 应用程序 在这种特定情况下,您可以改用 WinMain。该程序不使用 pCmdLine 值,因此当您将 wWinMain 更改为 WinMain,将 PWSTR pCmdLine 更改为 PSTR pCmdLine 时,应该可以编译成功。
如果您稍后需要Unicode命令行,请使用LPWSTR cmd_line = GetCommandLineW();,而不是使用WinMain参数。

16
解决方法是将编译参数中添加"-municode",正如@ssbssa在评论中提到的那样。(同时,已经更新了被接受的答案,并确认了这一点。)
示例:

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

示例:

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

请查看https://sourceforge.net/p/mingw-w64/wiki2/Unicode%20apps/

虽然编译上述代码时不必定义_UNICODE或UNICODE,但链接时需要使用-municode,因为它使用wmain()而不是传统的main()。


4

未定义的对 `WinMain' 的引用

它尝试查找WinMain,但失败了。所以你需要使用WinMain而不是wWinMain

另一个可能出现的问题是:

错误:C函数'int WinMain(HINSTANCE、HINSTANCE、PWSTR、int)'的声明冲突 int WINAPI WinMain(HINSTANCE hInstance、 HINSTANCE、PWSTR pCmdLine、int nCmdShow) ^~~~~~~ 在文件c:\mingw\include\windows.h:44:0中包含, 来自test.cpp:5:c:\mingw\include\winbase.h:1263:14:注意:之前的声明'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版本的入口点。


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) you forgot hPrevInstance - R1S8K

3

我在Windows 10 (64位)上使用mingw-w64。

如果您使用这个win32 示例

更改

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 

并将其与以下链接:

gcc hw.o

-1
我正在使用 VSCode,解决问题的方法如下:
  1. 打开设置
  2. 搜索“保存”
  3. 启用“运行前保存文件”
这样终端就能正常工作了。

这个答案和那个问题之间的关系是什么? - E. Vakili
我在VSCode上运行CPP文件时出现了错误。 - Aman gupta
2
这个问题是关于编译C++代码时出现的错误。与某些编辑器的自动保存功能无关。 - E. Vakili
1
不,他在某种程度上是正确的,当文件未保存时,常出现上述错误,因此您正在编译空文件。自动保存功能意味着这种情况将不会发生。 - Saw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接