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

问题描述 投票:0回答:5

目前,我正在尝试使用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)。

c++ winapi mingw mingw32 winmain
5个回答
16
投票

较新的 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
参数。


15
投票

解决方案是将

-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 版本入口点。


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

-2
投票

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

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

终端将正常工作

© www.soinside.com 2019 - 2024. All rights reserved.