【问题标题】:Undefined reference to WinMain (C++ MinGW)对 WinMain (C++ MinGW) 的未定义引用
【发布时间】:2020-02-07 23:26:21
【问题描述】:

目前,我正在尝试使用 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 应用程序教程: Example Code

我已经尝试重新安装 MinGW,但没有帮助(我也在使用 Windows 10)。

【问题讨论】:

标签: c++ winapi mingw mingw32 winmain


【解决方案1】:

此示例代码使用wWinMain,但是

需要注意的一点是,Visual C++ 支持“wWinMain”入口点 其中“lpCmdLine”参数是“LPWSTR”。您通常会使用 入口点的“_tWinMain”预处理器定义和 声明“LPTSTR lpCmdLine”,这样您就可以轻松地同时支持 ANSI 和 Unicode 构建。但是,MinGW CRT 启动库并没有 支持 wWinMain,所以你必须坚持使用标准的“WinMain” 如果您需要访问命令行,请使用“GetCommandLine()” 论据。

通过Building Win32 GUI Applications with MinGW

在这种特定情况下,您可以改用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

【讨论】:

    【解决方案2】:

    解决方案是在编译参数中添加-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()。

    【讨论】:

      【解决方案3】:

      对 `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 版本入口点。

      【讨论】:

      • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) 你忘了hPrevInstance
      【解决方案4】:

      我在 Windows 10(64 位)上使用 mingw-w64。

      如果你用这个win32example

      改变

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        相关资源
        最近更新 更多