【问题标题】:I keep getting "Undefined reference to WinMain@16" in Qt Creator我在 Qt Creator 中不断收到“对 WinMain@16 的未定义引用”
【发布时间】:2014-03-19 20:12:15
【问题描述】:

我正在尝试在 Qt Creator 3.1 中使用 SDL 2.0,在 Windows 7 中使用 Qt Build Suite (QBS)。

我已将链接放在我的 .qbs 中以定位 SDL 文件夹,我认为一切正常,因为在我的 main.cpp 中,它正在识别 SDL 函数,并尝试自动完成它们。

问题是,每当我尝试编译时,我都会得到“对 WinMain@16 的未定义引用”

我正在使用 MinGW 并在编译器首选项中将链接器标志设置为:-lmingw32 -lSDL2main -lSDL2 -mwindows

输出是:

 c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/lib/libmingw32.a(main.o): In function `main':
    e:\p\giaw\src\pkg\mingwrt-4.0.3-1-mingw32-src\bld/../mingwrt-4.0.3-1-mingw32-src/src/libcrt/crt/main.c:91: undefined reference to `WinMain@16'
    collect2.exe: error: ld returned 1 exit status

我的 .qbs 是:

import qbs 1.0

CppApplication {

    name: "testeSDL2"

    cpp.includePaths: [".",
        "C:/SDL2-2.0.3/i686-w64-mingw32/include"]

    cpp.libraryPaths: [
        "C:/SDL2-2.0.3/i686-w64-mingw32/lib"]

    cpp.dynamicLibraries: "SDL2"

    files: [
        "main.cpp"
    ]

    qbsSearchPaths: "C:/CppLibs/"
}

我一直在搜索,只找到了使用 .pro 而不是 .qbs 的常见 Qt 项目的答案...... SDL 站点中有一个部分说这是一个链接器问题,但我将它们设置在首选项窗口,我的猜测是我还需要在 .qbs 文件中以某种方式设置它们,但我不知道如何去做。有人可以帮忙吗?

【问题讨论】:

  • 你100%确定你有一个主函数被链接吗?
  • 是的,如果我从 main.cpp 中删除 #include 它将完美编译
  • 这很奇怪,因为 main 函数仍然存在两次。这有帮助吗? stackoverflow.com/questions/17048072/… 似乎需要一个-lSDLmain,不管这里翻译成什么。
  • 我在搜索错误时看到了该线程。我确实将链接器标志放在了 mingw 偏好窗口中,就像那样。我也为此尝试了 Code::Blocks ,显然它在那里工作,但不适用于 Qt 与 QBS ......这就是为什么我认为它与这些链接器标志相关的东西也需要在 .qbs 文件中......

标签: c++ qt linker


【解决方案1】:

我记得,SDL 定义了一个宏 main,它扩展为一些 SDL 特定的函数名称。

找到那个宏定义,你还可以找到禁用那个东西所需的宏符号。

哦,好吧,也许这应该是评论而不是答案,但是当/如果您发现(对不起,我没有时间检查这些来源),那么您可以将其标记为“解决方案”,嘿嘿。 :-)


附录:由于 OP 好心发布了 SDL 代码,我查看了它并找到了这条评论:

“如果您提供自己的WinMain(),您可以定义SDL_MAIN_HANDLED

...在包含 SDL 标头之前。

那么名为main的宏没有定义。

【讨论】:

  • 我不知道,在这里发现了类似的问题:stackoverflow.com/questions/11976084/why-sdl-defines-main-macro。我尝试在 main.cpp 中添加 #undef main 并且...嗯,它起作用了...但是,正如那家伙所说,我不知道这样做是否会导致一些负面后果,哈哈。
  • 我认为最好的办法是找到你需要定义的符号,以避免定义main
  • 抱歉,我仍然不确定您所说的“符号”是什么意思。我在这里上传了 SDL_main:pastebin.com/beaM84uG,你能告诉我我需要定义什么吗?除此之外,我也试过这个:stackoverflow.com/questions/396183/…。使用#ifdef _WIN32 #undef main #endif 的部分仍然有效。
  • 引用该代码,“如果您提供自己的 WinMain(),您可以定义 SDL_MAIN_HANDLED”。这意味着在包含 SDL 标头之前只需 #define 它,或者通过编译器选项(通常为 -D)定义它。考虑一下,后者可能更安全,但对于我自己的代码,我更喜欢在代码本身中包含与正确性相关的所有内容,因为这样可以更轻松地切换构建系统
猜你喜欢
  • 2021-11-18
  • 2013-01-15
相关资源
最近更新 更多