![](/img/trans.png)
[英]Code::Blocks, MinGW, libsdl, and GNU C++ compiler: undefined reference to `WinMain@16
[英]Undefined reference to WinMain (C++ MinGW)
目前,我正在尝试使用 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)。
此示例代码使用wWinMain
但
需要注意的一点是,Visual C++ 支持“wWinMain”入口点,其中“lpCmdLine”参数是“LPWSTR”。 您通常会为您的入口点使用“_tWinMain”预处理器定义并声明“LPTSTR lpCmdLine”,以便您可以轻松支持 ANSI 和 Unicode 构建。 但是,MinGW CRT 启动库不支持 wWinMain,因此如果您需要访问命令行 arguments,则必须坚持使用标准的“WinMain”并使用“GetCommandLine()”。
在这种特定情况下,您可以改用WinMain
。 该程序不使用pCmdLine
值,因此当您将wWinMain
更改为WinMain
并将PWSTR pCmdLine
为PSTR pCmdLine
时,它应该编译。
如果您以后需要 unicode 命令行,请使用LPWSTR cmd_line = GetCommandLineW();
而不是WinMain
参数。
较新的 Mingw 版本还支持-municode
linker 选项切换到备用启动代码,允许使用wWinMain
而不是WinMain
(或wmain
而不是main
)。 将其添加到您的命令行中,IDE 或 makefile 中的 linker 选项。
g++ other_options_and_arguments -municode
解决方案是将-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()。
未定义对“WinMain”的引用
它试图找到WinMain
并失败了。 所以你需要使用WinMain
而不是wWinMain
。
另一个可能的问题是
error: conflicting declaration of C function 'int WinMain(HINSTANCE, HINSTANCE, PWSTR, int)' int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) ^~~~~~~ In file included from 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 APIENTRY WinMain (HINSTANCE, HINSTANCE, LPSTR, int);
所以你需要使用LPSTR
而不是PWSTR
。
然后入口点将是这样的:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow)
以上是 ANSI 版本入口点。
我将 mingw-w64 用于 Windows 10(64 位)。
如果您使用此 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
我认为您所做的是在编辑环境设置中将 mysys64 路径添加到您的系统,但您必须在当前用户设置中添加它
我正在使用 vscode,我的问题的答案是:
终端将正常工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.