簡體   English   中英

對 WinMain@16 C++、SDL-2 的未定義引用

[英]undefined reference to WinMain@16 C++, SDL-2

我一直收到錯誤undefined reference to WinMain@16 為了節省空間, 這里有一個指向當前項目中所有文件的鏈接 目前,除了創建一個窗口,將其填充為綠色,然后在角落繪制一個框,同時通過控制台跟蹤我的鼠標位置之外,它應該不會做太多事情。 但是,它不會構建,並且出現上述錯誤。

我的鏈接器庫是:

  • glew32s
  • libSDL2main
  • mingw32
  • 庫SDL2
  • opengl32
  • glew32

我遵循 C++11 ISO C++ 語言標准使用帶有 g++ 的 Codeblocks 13.12。 我的電腦使用的是 Windows 10,以防萬一。

我花了很長時間試圖找到解決方案,似乎每個人都有一個完全不同的解決方案,到目前為止,沒有一個對我有用。 一些例子包括:

  • 按照這個類似的問題將 SDL2_image 添加到我的鏈接庫中。 它給了我錯誤-lSDL2_image
  • 完全從頭開始這個項目,以防我沒有注意到一些錯字是原因。 (我得到了完全相同的錯誤)。
  • 將我的main功能更改為WinMain 我收到了同樣的錯誤信息。
  • 添加Windows.h標頭。 這沒有什么值得注意的。
  • 我喜歡的圖書館的各種所謂的“正確命令”。 到目前為止,這些似乎都沒有幫助。

我還應該指出,由用戶 Cheers 和 hth 提供的答案。 - 阿爾夫, 可能就是我要找的東西,但老實說,我無法完全理解基於它我應該做什么。

如果有任何我忘記包含的相關信息,請告訴我,我會盡快完成。 提前致謝。

我想你想要

#define SDL_MAIN_HANDLED

在您的主文件中,在該行之前

#include <SDL2/SDL.h>

解釋:

在 SDL / SDL2 中,為了嘗試使某些類型的應用程序的跨平台開發更簡單,SDL 為您的應用程序創建了一個自定義“入口點”。 也就是說,您的int main()不是真正的main。 發生的情況是, main被定義為 SDL 標頭中的宏,這會導致您的 main 被重命名為SDL_main或類似的。 然后,在“SDL_main”庫中定義了一個不同的main ,它將成為您應用程序的真正main 這個main只是以適合平台的任何方式獲取命令行參數,並調用您的main (已重命名為SDL_main )。

在 Windows 上,關於您的應用程序是作為控制台程序還是作為 gui 程序 iiuc 啟動也存在一些差異。

有時您希望 SDL 為您做這些事情,但如果您正在開發傳統的控制台程序,通常您不會這樣做。 所以你通過 SDL 這個SDL_MAIN_HANDLED定義來防止做所有這些事情。

#undef main方法也可以使用,但效果不是很好,因為通過這種方式,您可以告訴 SDL 發生了什么,而使用另一種方法,SDL 認為將使用所有內容,實際上您粗略地禁用了它稍后使用#undef

如果您想查看各種宏/平台檢查的詳細信息,可以查看SDL_main.h標頭。 如果想知道SDL主系統有什么好處,可以看SDL文檔。

接受的答案中建議的解決方案(取消定義main ,定義SDL_MAIN_HANDLED和所有這些)偏離了 SDL2 的使用方式。 預期的方法是否合理是另一個問題,但我更願意堅持下去。


此錯誤意味着您沒有鏈接正確的庫,或以錯誤的順序鏈接它們。
您需要按照以下確切順序進行操作: -lmingw32 -lSDL2main -lSDL2

這樣做可能會將錯誤更改為undefined reference to `SDL_main' 這意味着您使用的main簽名與 SDL 期望的不同。 它必須是int main(int, char **)int main(int, char *[]) 添加參數名稱是允許的,但您不能更改任何其他內容:您必須擁有參數,即使您不使用它們。

暫無
暫無

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

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