目前,我正在尝试使用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)。
发布于 2019-10-11 07:38:59
此示例代码使用wWinMain,但
需要注意的是,VisualC++支持“wWinMain”入口点,其中“lpCmdLine”参数是“LPWSTR”。通常,您将使用“_tWinMain”预处理器定义作为入口点,并声明“LPTSTR lpCmdLine”,以便您可以轻松地支持ANSI和Unicode构建。但是,MinGW CRT启动库不支持wWinMain,因此如果需要访问命令行参数,则必须坚持使用标准的“WinMain”并使用“GetCommandLine()”。
在这种情况下,您可以使用WinMain代替。此程序不使用pCmdLine值,因此当您将wWinMain更改为WinMain,将PWSTR pCmdLine更改为PSTR pCmdLine时,应该对其进行编译。
如果以后需要unicode命令行,请使用LPWSTR cmd_line = GetCommandLineW();而不是WinMain参数。
较新的明威版本还支持-municode链接器选项,切换到备用启动代码,允许使用wWinMain而不是WinMain (或wmain而不是main)。将其添加到IDE或makefile中的命令行、链接器选项中。
g++ other_options_and_arguments -municode发布于 2020-06-20 17:02:07
解决方案是将-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()。
发布于 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版本入口点。
https://stackoverflow.com/questions/58324230
复制相似问题