【问题标题】:SDL 2 Undefined Reference to "WinMain@16" and several SDL functionsSDL 2 未定义对“WinMain@16”和几个 SDL 函数的引用
【发布时间】:2013-06-07 12:52:55
【问题描述】:

我刚刚安装了 SDL 2,但遇到了一些严重的问题。 这是我的代码:

#include <SDL2\SDL.h>

int main(int argc, char* argv[]) {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Quit();
    return 0;
}

我无法编译,因为我得到了标题中描述的错误:

obj\Debug\main.o||In function SDL_main':|  
C:\Users\myuser\Desktop\test 2000\main.cpp|5|undefined reference to SDL_Init'|
C:\Users\myuser\Desktop\test 2000\main.cpp|7|undefined reference to SDL_Quit'|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\libmingw32.a(main.o):main.c|| undefined reference to WinMain@16'|  
||=== Build finished: 3 errors, 0 warnings ===|

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    如果您使用的是 cLion IDE 中默认的 CMakeLists.txt,您应该在末尾添加这一行:

    target_link_libraries(space_fighters mingw32 SDL2main SDL2)
    

    我有同样的问题,我的情况是因为我错过了“mingw32”

    【讨论】:

    • target_link_libraries(space_fighters PUBLIC mingw32 SDL2::SDL2main SDL2::SDL2) 用于现代 CMake。不使用 PUBLIC/PRIVATE/INTERFACE 会递归地将目标降级为 CMake 2.8.12 之前的行为。
    【解决方案2】:

    当我尝试在 Windows 10 上的 Eclipse CDT 1909 中构建和运行我最初在 MacOS 上的 Eclipse 中创建的项目时,我遇到了类似的问题。

    我发现以下步骤使用 minGW64 编译器有效。

    RMB 点击项目并选择属性。 在 Project Properties > C/C++ Build 中创建一个新的 C/C++ Build Configuration,通过 LMB 点击 Manage Configurations 和 LMB 点击 New,将其命名为 Debug_Windows,将 Copy Setting from 设置为 Default configuration,使其处于活动状态,LMB 点击 OK,将 Configuration 设置为Debug_Windows。

    设置项目属性 > C/C++ Build > Builder Settings > Build Command > Current Builder to CDT Internal Builder

    设置项目属性 > C/C++ Build > Builder Settings > Tool Chain Editor > Current toolchain to MinGW GCC

    设置项目属性 > C/C++ Build > Builder Settings > Tool Chain Editor > Current builder to CDT Internal Builder

    在 Project Properties > C/C++ Build > Settings > GCC C++ Compiler > Includes 中添加以下路径 "C:\Applications\Library\SDL2-2.0.9\x86_64-w64-mingw32\include\SDL2"

    将以下路径添加到 Project Properties > C/C++ Build > Settings > GCC C++ Linker > Libraries "C:\Applications\Library\SDL2-2.0.9\x86_64-w64-mingw32\lib"

    将以下库按顺序添加到 Project Properties > C/C++ Build > Settings > GCC C++ Linker > Libraries SLD2main SDL

    导航到项目属性>运行/调试设置,LMB点击新建,选择C/C++应用程序,LMB点击确定,在C/C++应用程序字段中输入 Debug_Windows\project_name.exe(将 project_name 替换为正确的值)。

    将构建配置更改为 Debug_Windows。

    关闭项目属性。

    添加预处理指令 #define SDL_MAIN_HANDLED 在包含 main 函数的文件的顶部。 如果没有预处理器指令,程序将无法正确链接。

    运行程序 RMB 点击项目并选择 Run as > Run Configurations 并选择为构建创建的运行配置。

    将SDL2.dll复制到项目目录结构的顶层,就像复制到Debug或Debug_Windows目录一样,每次构建项目时都会删除。

    我发现的关键点是没有必要在链接器库中包含 mingw32 并且 #define SDL_MAIN_HANDLED 需要在包含 main 的文件中并且在 #include 之前。

    【讨论】:

      【解决方案3】:

      发布编译器命令。 例如:g++/gcc ....

      您可能没有链接库。

      http://content.gpwiki.org/index.php/SDL:Tutorials:Setup 你应该有 lib 的路径,包含在 ide 中。 (我看到你正在使用代码块)

      添加到链接器设置: -lmingw32 -lSDLmain -lSDL

      http://www.sdltutorials.com/sdl-tutorial-basics

      【讨论】:

      • 我看到你给我看的教程是关于 sdl 1.2 的。我在谈论 sdl 2.0 ,如标题所示。现在据我所知,我在这些链接器之前尝试过,但它们没有用。我相信新的类似于: -lmingw32 -lSDL2main -lSDL2 。但即使这样,也缺少一些东西......
      • wiki.libsdl.org/moin.fcg/FAQWindows :D 你的解决方案显然是指向那里的。
      • 我有些不明白。 “当你使用 gcc 编译时,你需要确保 sdl-config 的输出遵循你在命令行上的源文件:gcc -o test test.c sdl-config --cflags --libs” 你是怎么做的那个?
      • ---我找到了解决方案!--
      • 在代码块 10.05 上:“设置”->“编译器和调试器”->“链接器设置”。在“链接器库”上按“添加”按钮并按此顺序分别添加“mingw32”、“SDL2main”、“SDL2”、“SDL2_image”,不带“”。在“其他链接器选项”上,添加“-mwindows”没有“”。还要确保您在“搜索目录”上链接了正确的文件夹。在“编译”面板上,从您的 PC 中“添加”到“包含”文件夹的链接,然后在“链接器”面板上,“添加" 将新文件(来自 sdl_img 和混音器文件夹)添加到原始 SDL 文件夹后,指向“lib”的链接
      【解决方案4】:

      您需要以相同的顺序将这些添加到链接器库中:

      mingw32
      SDL2main
      SDL2
      

      注意顺序很重要。

      【讨论】:

        【解决方案5】:

        我想你想要

        #define SDL_MAIN_HANDLED
        

        在你的主文件中,行前

        #include <SDL2/SDL.h>
        

        来自:https://stackoverflow.com/a/32343111/5214543

        【讨论】:

        • 这应该标记为正确答案,谢谢!
        • 你刚刚救了我一天(实际上是一个晚上)。但是,在此之前,我能够以某种方式在没有此定义的情况下编译程序,并且只使用一个 -lSDL2 参数,但现在我不记得如何也无法重现它。
        【解决方案6】:

        我通过交换解决了这个问题

        int main(int argc, char* argv[])
        

        符合

        int WINAPI WinMain(HINSTANCE hInstance,
                           HINSTANCE hPrevInstance,
                           LPSTR lpCmdLine,
                           int nCmdShow )
        

        不知道为什么要说实话,然后我又转向了 SFML。

        【讨论】:

          【解决方案7】:

          虽然接受的答案有效(如果您完全按照它,或阅读 cmets), 有一个警告:您必须按照给定的链接库的顺序进行操作

          g++ 01_hello_SDL.cpp -I{add correct path here}/include/SDL2 -L{add correct path here}/lib -lmingw32 -lSDL2main -lSDL2

          如果您不希望控制台在窗口旁边运行,请将-mwindows 添加到选项中

          【讨论】:

            【解决方案8】:

            我一直为此苦苦挣扎。

            只需将 sdl 文件从程序文件中移到桌面或文档等,然后从那里将它们链接到 C。

            认为这与 Windows 不允许 C 访问它们有关。

            希望这会有所帮助 酷

            【讨论】:

              猜你喜欢
              • 2015-11-27
              • 1970-01-01
              • 1970-01-01
              • 2020-05-11
              • 1970-01-01
              • 2021-11-18
              • 2013-01-15
              相关资源
              最近更新 更多