首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对WinMain (C++ MinGW)的未定义引用

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

Stack Overflow用户
提问于 2019-10-10 13:34:10
回答 5查看 42.7K关注 0票数 23

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

代码语言:javascript
复制
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)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-10-11 07:38:59

此示例代码使用wWinMain,但

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

通过用Win32构建MinGW图形用户界面应用程序

在这种情况下,您可以使用WinMain代替。此程序不使用pCmdLine值,因此当您将wWinMain更改为WinMain,将PWSTR pCmdLine更改为PSTR pCmdLine时,应该对其进行编译。

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

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

代码语言:javascript
复制
g++ other_options_and_arguments -municode
票数 14
EN

Stack Overflow用户

发布于 2020-06-20 17:02:07

解决方案是将-municode添加到编译参数中,正如@ssbssa在注释中提到的那样。(与此同时,已接受的答复已经更新,并证实了这一点)。

示例:

代码语言:javascript
复制
g++ helloworld3.cpp -o helloworld3 -Wl,-subsystem,windows -municode

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

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

票数 12
EN

Stack Overflow用户

发布于 2019-10-11 02:35:48

对“`WinMain”的未定义引用

它试图找到WinMain,但失败了。因此,您需要使用WinMain而不是wWinMain

另一个可能的问题是

错误:C函数‘HINSTANCE (HINSTANCE,HINSTANCE,PWSTR,int)’int WINAPI WinMain(HINSTANCE HINSTANCE,HINSTANCE,PWSTR pCmdLine,int nCmdShow) ^~ In文件的声明冲突,其中包括c:\mingw\include\windows.h:44:0、from test.cpp:5: c:\mingw\include\winbase.h:1263:14:注意:以前的声明'int WinMain(HINSTANCE、HINSTANCE、LPSTR、int)‘int (HINSTANCE、HINSTANCE、LPSTR、int);

因此,您需要使用LPSTR而不是PWSTR

那么入口点会是这样的:

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

以上是ANSI版本入口点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58324230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档