【问题标题】:Trying to link SDL in MinGW's G++ is failing miserably.. :/试图在 MinGW 的 G++ 中链接 SDL 失败得很惨..:/
【发布时间】:2011-09-26 12:34:19
【问题描述】:

昨晚深夜我感到无聊.. 所以我开始用 C++ 和 SDL 编写一个小型的“Noughts and Crosses”类型的游戏。我编写了游戏的大部分基本部分,但是当我编译它以检查错误时,我收到了错误消息:未定义对 WinMain@16 的引用;所以,“啊,只需添加 -lmingw32 应该会有所帮助!”,我在想。

g++ main.cpp -o nac.exe -lmingw32 -lSDLmain -lSDL -SDL_image

现在它给了我这个:未定义的 SDL_main 引用;

我认为我所做的并没有错,我尝试将 -lmingw32 移动到右侧、中左和中右以确保.. Nada!

我不认为这会是我的源代码,但只是以防万一:http://pastebin.com/r7fEAkr4 另外,我认为我在数组定义方面有点失败......但我会尽快解决这个问题。

非常感谢任何帮助! 埃克林

【问题讨论】:

    标签: c++ linker g++ mingw


    【解决方案1】:

    您的主函数需要这个确切的签名:int main(int, char**)

    【讨论】:

    • 非常感谢您的快速回复。 :) 我看到我以前所有的游戏/应用程序现在都有那个原型(签名?)!再次,非常感谢!
    • 这样你就明白发生了什么:C 定义了第一个调用的函数是main。定义接受从void main(void)int main(int, char*) 的任何原型。然而,SDL 使用了一个讨厌的技巧:SDL 有它自己的main 函数,并使用:#define main SDL_main。在SDL的代码中,经过一些处理,调用SDL_main,输入你的代码。由于 c++ 允许函数覆盖,因此定义 SDL_main(void) 不会导致任何问题,除非 SDL 正在寻找 SDL_main(int, char**),因此会出现错误。
    • 啊!我明白了,这是因为 SDL 是用纯 C 编写的吗?
    • 不完全是。当您的编译器看到main 的定义时,它就知道它必须使用C 接口。但是,当您用#include <SDL/SDL.h> 编写main 时,它会转换为SDL_main。这次它不知道它必须使用标准的 C 接口,并在使用 g++ 编译时将其视为 C++ 函数,允许覆盖。它还覆盖了主函数可以是void main(void) 的定义,因为它不知道它是主函数。因为对他来说它不是 C 函数,所以 SDL 会忽略它。我认为在标题的某个地方,SDL_main(int, char*) 被定义为 C 函数。
    • 你也会知道 SDL_main 技巧主要是因为 Windows,它有一个不同于 ANSI main 的 WinMain 定义。在 Linux 上,SDL 的 main 只调用 SDL_main,而在 Windows 上,对参数进行了完整的处理,以便在传递给 SDL_main 时它们是相同的。我不喜欢 Windows 的另一个原因。
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多