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

wuz*_*ipu 11 c++ winapi mingw winmain mingw32

目前我正在尝试使用 C++ 制作一个 Windows 应用程序。为了编译我的程序,我使用 Mingw GCC。顺便说一句,我在 Windows 10 上。但是一旦我使用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):未定义对`WinMain' collect2.exe的引用:错误:ld返回1退出状态终端进程因退出而终止代码:1

我尝试编译的示例代码来自此 Windows 应用程序教程: 示例代码

我已经尝试重新安装 mingw 但它没有帮助。这就是为什么我希望这里有人可以帮助我解决我的问题。先感谢您!

Bas*_*asj 16

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

例子:

g++ helloworld3.cpp -o helloworld3 -Wl,-subsystem,windows -municode
Run Code Online (Sandbox Code Playgroud)

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

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


Dan*_*Sęk 9

此示例代码使用wWinMain

需要注意的一件事是,Visual C++ 支持“wWinMain”入口点,其中“lpCmdLine”参数是“LPWSTR”。您通常会使用“_tWinMain”预处理器定义作为入口点并声明“LPTSTR lpCmdLine”,以便您可以轻松支持 ANSI 和 Unicode 构建。但是,MinGW CRT 启动库不支持 wWinMain,因此如果您需要访问命令行参数,则必须坚持使用标准的“WinMain”并使用“GetCommandLine()”。

通过使用 MinGW 构建 Win32 GUI 应用程序

在这种特定情况下,您可以WinMain改用。这个程序不使用pCmdLine的值,所以当你改变它应编译wWinMainWinMainPWSTR pCmdLinePSTR pCmdLine

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

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

g++ other_options_and_arguments -municode
Run Code Online (Sandbox Code Playgroud)