C++ SDL 2未定义对“的引用”;WinMain@16&引用;和几个SDL函数

C++ SDL 2未定义对“的引用”;WinMain@16&引用;和几个SDL函数,c++,sdl,C++,Sdl,我刚刚安装了SDL2,我有一些严重的问题。 这是我的代码: #include <SDL2\SDL.h> int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_Quit(); return 0; } 发布编译器命令。 例如:g++/gcc 您可能没有链接库 您应该拥有ide中包含的库的路径。 (我看到您正在使用代码块) 添加到链接器设置: -lmingw32-lSDLmain-lS

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

#include <SDL2\SDL.h>

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

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

您可能没有链接库

您应该拥有ide中包含的库的路径。 (我看到您正在使用代码块)

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


我一直在为此奋斗

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

我认为这与Windows不允许C访问它们或其他东西有关

希望这有帮助
很酷

尽管接受的答案有效(如果你完全遵循它,或者阅读评论), 有一个警告:您必须遵循给定的链接库的顺序

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


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

我通过交换

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

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow )
说实话,我不知道为什么,然后我又转到了SFML。

我想你想要的

#define SDL_MAIN_HANDLED
在主文件中,在行之前

#include <SDL2/SDL.h>
#包括

from:

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

mingw32
SDL2main
SDL2

请注意,顺序很重要。

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

我发现使用minGW64编译器可以完成以下步骤

单击项目并选择属性。 在“项目属性”>“C/C++生成”中,通过LMB单击“管理配置”和LMB单击“新建”创建新的C/C++生成配置,将其命名为“调试窗口”,将“复制设置从”设置为“默认配置”,使其处于活动状态,LMB单击“确定”,将配置设置为“调试窗口”

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

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

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

将以下路径添加到Projtudiths> C/C++ + Buffe>设置> GCC C++编译器> “C:\Applications\Library\SDL2-2.0.9\x86\U 64-w64-mingw32\include\SDL2”

将以下路径添加到ProjtProjks> C/C++ + Buffue>设置> GCC C++链接器>库 “C:\Applications\Library\SDL2-2.0.9\x86\U 64-w64-mingw32\lib”

将下列库添加到ProjtProjts> C/C++ + Buffue>设置> GCC C++链接器>库中 SLD2main SDL

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

将生成配置更改为调试Windows

关闭项目属性

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

要运行程序,请单击项目并选择运行方式>运行配置,然后选择为生成创建的运行配置

将SDL2.dll复制到项目目录结构的顶层,就像它被复制到调试或调试Windows目录一样,每次生成项目时都会删除它


我发现的关键点是,没有必要在链接器库中包含mingw32,并且“define SDL_MAIN_HANDLED”需要位于包含MAIN和before include的文件中。

如果您使用的是cLion IDE中默认的CMakeLists.txt,那么最后应该有这一行:

target_link_libraries(space_fighters mingw32 SDL2main SDL2)

我也有同样的问题,我的案例是因为我错过了“mingw32”

我看到你给我看的教程是关于SDL1.2的。我说的是SDL2.0,如标题所示。现在据我所知,我在这些链接器之前尝试过,但都不起作用。我相信新的是这样的:-lmingw32-lSDL2main-lSDL2。但即使这样,还是少了一些东西…:很明显,你的解决方案已经指出了。我不明白什么。“使用gcc编译时,需要确保sdl配置的输出遵循命令行上的源文件:gcc-o test.c sdl config--cflags--libs”如何做到这一点?--我一直在寻找解决方案--在代码块10.05上:“设置”->“编译器和调试器”->“链接器设置”。在“链接器库”上,按“添加”按钮,按此顺序分别添加“mingw32”、“SDL2main”、“SDL2”、“SDL2_image”,而在“其他链接器选项”上,添加“-mwindows”而不添加“。还要确保在“搜索目录”上链接了正确的文件夹。在“编译”窗格上,添加“从PC到“包含”文件夹的链接”,等等“链接器”窗格,“添加”链接到“库”,在您将新文件(来自sdl_img和mixer文件夹)添加到原始sdl文件夹后,这应该被标记为正确答案,谢谢!您刚刚为我节省了一天(实际上,一个晚上)然而,在此之前,我能够在不使用此定义的情况下编译程序,并且只使用一个-lSDL2参数,但现在我不记得如何并且无法复制它。
target\u link\u库(space\u/w32 SDL2::SDL2main SDL2::SDL2)
用于现代CMake。不使用
公共
/
私有
/
接口
递归地将目标降级为CMake 2.8.12之前的行为。
target_link_libraries(space_fighters mingw32 SDL2main SDL2)