SDL 2 对"WinMain@16"和多个 SDL 函数的未定义引用

SDL 2 Undefined Reference to "WinMain@16" and several SDL functions

本文关键字:SDL 函数 引用 未定义 WinMain@16      更新时间:2023-10-16

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

#include <SDL2SDL.h>
int main(int argc, char* argv[]) {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Quit();
    return 0;
}

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

objDebugmain.o||In function SDL_main':|  
C:UsersmyuserDesktoptest 2000main.cpp|5|undefined reference to SDL_Init'|
C:UsersmyuserDesktoptest 2000main.cpp|7|undefined reference to SDL_Quit'|
c:program filescodeblocksmingwbin..libgccmingw324.4.1......libmingw32.a(main.o):main.c|| undefined reference to WinMain@16'|  
||=== Build finished: 3 errors, 0 warnings ===|

我想你要

#define SDL_MAIN_HANDLED
主文件中的

,在

行之前
#include <SDL2/SDL.h>

从:https://stackoverflow.com/a/32343111/5214543

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

您可能没有链接库。

http://content.gpwiki.org/index.php/SDL:教程:设置您应该有这个库的路径,包含在ide中。(我看到你正在使用代码块)

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

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

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

mingw32
SDL2main
SDL2

虽然接受的答案是有效的(如果你完全遵循它,或者阅读评论),有一点需要注意:您必须按照给定的顺序链接库

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

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

我一直在挣扎。

只要把sdl文件从你的程序文件移到你的桌面或文档等,并从那里链接到C。

认为这与Windows不允许C访问它们或其他什么有关。

希望这对你有帮助很酷的

我通过交换

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

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

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

如果你使用的是CMakeLists.txt,这是cleion IDE的默认设置,你应该在末尾加上这一行:

target_link_libraries(space_fighters mingw32 SDL2main SDL2)

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

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

我发现下面的步骤使用minGW64编译器工作。

RMB单击项目,选择properties。在项目属性> C/c++构建创建一个新的C/c++构建配置通过LMB点击管理配置和LMB点击新建,命名为Debug_Windows,将复制设置设置为默认配置,使其活跃,LMB点击确定,将配置设置为Debug_Windows。

设置项目属性> C/c++ Build>生成器设置>构建命令>当前生成器为CDT内部生成器

设置项目属性> C/c++构建>构建器设置>工具链编辑器>当前工具链为MinGW GCC

设置项目属性> C/c++ Build>生成器设置>工具链编辑器>当前生成器为CDT内部生成器

在Project Properties> C/c++ Build> Settings> GCC c++ Compiler> Includes中添加如下路径"C: 程序图书馆 SDL2-2.0.9 x86_64-w64-mingw32 SDL2"包括

在Project Properties> C/c++ Build> Settings> GCC c++ Linker> Libraries中添加如下路径"C: 程序图书馆 SDL2-2.0.9 x86_64-w64-mingw32 lib "

按顺序将以下库添加到项目属性> C/c++构建>设置> GCC c++链接器>库中SLD2mainSDL

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

将构建配置更改为Debug_Windows。

关闭项目属性。

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

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

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

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