目前,我正在尝试使用 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,所以你必须坚持使用标准的“WinMain” 如果需要访问命令行,请使用“GetCommandLine()” 争论。
在这种特定情况下,您可以改用
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
解决方案是在编译参数中添加
-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
.
另一个可能的问题是
错误: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版本入口点。
我在 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
我正在使用 vscode,我的问题的答案是:
终端将正常工作