【问题标题】:undefined reference to `WinMain' : When using Cygwin, SDL2 and Netbeans未定义对“WinMain”的引用:使用 Cygwin、SDL2 和 Netbeans 时
【发布时间】:2026-01-09 22:20:03
【问题描述】:

我们将不胜感激。 我真的为此绞尽脑汁,太棒了。

我已经安装了 cygwin 和 Netbeans,并且已经成功地开发、编译和运行了一个小型 SDL-1.2 windows 游戏,没有任何问题。

现在问题来了,我已经安装了 SDL2 并正在尝试编译。特别是链接。

我和以前一样,将“libSDL2.a”和“libSDL2main.a”添加到我在 Netbeans 中的项目的链接器选项中;但我得到“未定义的对‘WinMain’的引用”错误

现在,我对此进行了调查,似乎链接器无法将我的 main() 函数链接到 WinMain 函数。

我看到的另一个答案是将“-lmingw32 -lSDLmain -lSDL”添加到链接器选项但我不使用 mingw,我使用的是 cygwin,什么是 mingw32.lib 的 cygwin 等效项

我想主要问题是: 如果我使用 Cygwin、SDL2 和 Netbeans,我给链接器提供了哪些选项?

任何帮助将不胜感激。

【问题讨论】:

  • 无论你使用的是 MinGW、Cygwin、本机 Linux 终端还是 OSX,在命令行上的链接都是一样的。
  • 好吧,所以。在 cygwin 中,当我运行这个“g++ main.cpp -lSDL2main -lSDL2”时,我得到了完全相同的“未定义的对‘WinMain’的引用”。这也与 netbeans 完全分开。
  • 在 Cygwin 和 MinGW 中,库是为 POSIX 环境构建的(显然),这意味着它没有 Windows 主函数​​,您需要创建自己的 WinMain 函数,然后调用main 函数由 SDL2main 库提供。
  • 嗯,好吧,这是 SDL2 中的新功能吗?因为我从不需要对带有 SDL1.2 的 Windows 主程序做任何事情。另外,如果这都是 posix 并且我看不到 windows main,那么为什么链接器会抱怨 WinMain 呢?

标签: c++ netbeans linker cygwin sdl-2


【解决方案1】:

对于我刚刚使用 Cygwin 构建的库,我添加了以下编译器标志:

 -shared -Wl,--out-implib,lib$(LIB_NAME).dll.a

这使我能够构建我的库,而不会出现可怕的“缺少 WinMain”错误消息。

【讨论】:

    【解决方案2】:

    您是否使用#undef main infront of your main 进行过测试?

    /*
     * If 'main' is defined we clear that definition
     * to get our default 'main' function back.
     */
    #ifdef main
    # undef main
    #endif /* main */
    
    int main(int argc, char** argv)
    {
        // ...
        return 0;
    }
    

    Using Netbeans with Cygwin and SDL, including SDL.h creates strange error


    也可能有帮助:

    我收到“未定义对 'WinMain@16' 的引用”

    在 Visual C++ 下,需要与 SDL2main.lib 链接。 在gcc构建环境下包括Dev-C++,需要链接“sdl-config --libs”的输出,通常是: -lmingw32 -lSDL2main -lSDL2 -mwindows

    (http://wiki.libsdl.org/FAQWindows#I_get_.22Undefined_reference_to_.27WinMain.4016.27.22)

    【讨论】:

    • 好的,所以添加 #ifdef main #undef main #endif 有效。但是,我确实在某处读到过,这是一个混乱而令人讨厌的工作,如果我真正理解这是为什么以及它实际上做了什么,我会感觉更好?
    • 我猜这是因为 Windows 需要一些额外的设置。最好看看 sdl main 的实现。