17

目前,我正在尝试使用 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)。

4

4 回答 4

12

此示例代码使用wWinMain

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

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

在这种特定情况下,您可以WinMain改用。该程序不使用value,因此当您更改为和topCmdLine时它应该编译。wWinMainWinMainPWSTR pCmdLinePSTR pCmdLine

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

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

g++ other_options_and_arguments -municode
于 2019-10-11T07:38:59.060 回答
6

解决方案是添加-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()。

于 2020-06-20T17:02:07.597 回答
3

未定义对“WinMain”的引用

它试图找到WinMain并失败了。所以你需要 useWinMain而不是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, from test.cpp:5: c:\mingw\include\winbase.h:1263:14: 注意:先前的声明 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)' int APIENTRY WinMain (HINSTANCE, HINSTANCE, LPSTR, int);

所以你需要 useLPSTR而不是PWSTR.

然后入口点将是这样的:

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

以上是 ANSI 版本入口点。

于 2019-10-11T02:35:48.223 回答
3

我将 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
于 2021-01-22T12:48:22.137 回答