簡體   English   中英

對 WinMain (C++ MinGW) 的未定義引用

[英]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()”。

通過使用 MinGW 構建 Win32 GUI 應用程序

在這種特定情況下,您可以改用WinMain 該程序不使用pCmdLine值,因此當您將wWinMain更改為WinMain並將PWSTR pCmdLinePSTR 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,我的問題的答案是:

  1. 打開設置
  2. 搜索保存
  3. 運行前啟用保存文件

終端將正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM