对 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个回答
14
投票

此示例代码使用

wWinMain
但是

需要注意的一点是 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
参数。

较新的 Mingw 版本还支持

-municode
链接器选项切换到备用启动代码,允许使用
wWinMain
代替
WinMain
(或
wmain
代替
main
)。将它添加到您的命令行、IDE 或 makefile 中的链接器选项。

g++ other_options_and_arguments -municode

12
投票

解决方案是在编译参数中添加

-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

-3
投票

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

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

终端将正常工作

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