SDL 2未定义参考“WinMain@16”,以及几个SDL函数

13

我刚刚安装了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 ===|
8个回答

43

3
应该将这个标记为正确答案,谢谢! - James
1
你刚刚为我节省了一整天(实际上,是一个晚上)。然而,在这之前,我能够以某种方式编译程序,而不需要这个定义,并且只使用单个-lSDL2参数,但现在我不记得如何再次进行并复制。 - Andrei Nikolaenko
没错。大约30分钟的研究就在这里结束了。 - Trey Tomes

12

2
我看到你给我展示的教程是关于sdl 1.2的。我说的是sdl 2.0,正如标题所示。据我所知,我之前尝试过这些链接器,但它们没有起作用。我相信新的链接器类似于:-lmingw32 -lSDL2main -lSDL2。但即使这样,还有一些东西缺失... - Mihai
你好,显然你的解决方案可以在这里找到:http://wiki.libsdl.org/moin.fcg/FAQWindows - adderly
我不明白某些东西。“当您使用gcc编译时,需要确保sdl-config的输出跟随命令行上的源文件:gcc -o test test.c sdl-config --cflags --libs”,您该如何做到这一点? - Mihai
我找到了解决办法! - Mihai
2
在CodeBlocks 10.05中:选择“设置”->“编译器和调试器”->“链接器设置”。在“链接器库”中点击“添加”按钮,按照“mingw32”,“SDL2main”,“SDL2”,“SDL2_image”的顺序分别添加,不要加引号。在“其他链接器选项”中添加“-mwindows”,不要加引号。同时确保在“搜索目录”中链接了正确的文件夹。在“编译”面板中,“添加”您电脑上“include”文件夹的链接,在“链接器”面板中,“添加”到“lib”文件夹的链接,之后您需要将新的文件(来自sdl_img和mixer文件夹)添加到原始的SDL文件夹中。 - Mihai

9

你需要按照相同的顺序将它们添加到链接库中:

mingw32
SDL2main
SDL2

请注意顺序很重要。

5
尽管被接受的答案有效(如果你完全按照它的步骤操作或阅读评论),但有一个警告:必须按照给定的链接库顺序进行链接。请使用以下命令进行编译:g++ 01_hello_SDL.cpp -I{正确的路径}/include/SDL2 -L{正确的路径}/lib -lmingw32 -lSDL2main -lSDL2 如果您不想在窗口旁边运行控制台,请将 -mwindows 添加到选项中。

2

我曾经苦苦挣扎。

只需将sdl文件从程序文件移动到桌面、文档等位置,并从那里将它们链接到C即可。

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

希望这能帮到你,很酷。


2
我通过交换

来解决这个问题。
int main(int argc, char* argv[])

line with

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

说实话我也不知道为什么,但我已经转向使用SFML了。


1
如果您正在使用cLion IDE中默认的CMakeLists.txt,则应在末尾添加此行:
target_link_libraries(space_fighters mingw32 SDL2main SDL2)

我也曾遇到同样的问题,原因是我没有安装"mingw32"。


对于现代 CMake,target_link_libraries(space_fighters PUBLIC mingw32 SDL2::SDL2main SDL2::SDL2)。不使用 PUBLIC/PRIVATE/INTERFACE 会将目标降级为 CMake 2.8.12 之前的行为。 - Xeverous

-2

我在Windows 10上使用Eclipse CDT 1909构建和运行原本在MacOS上创建的项目时遇到了类似的问题。

我发现使用minGW64编译器可以采取以下步骤解决:

右键单击项目,选择属性。在“项目属性”>“C/C++构建”中,通过左键单击“管理配置”和左键单击“新建”创建一个名为Debug_Windows的新的C/C++构建配置,将其从默认配置中复制设置,使其处于活动状态,左键单击“确定”,将配置设置为Debug_Windows。

将“项目属性”>“C/C++构建”>“构建命令”>“当前构建器”设置为CDT内部构建器。

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

将“项目属性”>“C/C++构建”>“构建器设置”>“工具链编辑器”>“当前构建器”设置为CDT内部构建器。

将以下路径添加到项目属性 > C/C++ Build > 设置 > GCC C++ 编译器 > 包含中: "C:\Applications\Library\SDL2-2.0.9\x86_64-w64-mingw32\include\SDL2"

将以下路径添加到项目属性 > C/C++ Build > 设置 > GCC C++ 链接器 > 库中: "C:\Applications\Library\SDL2-2.0.9\x86_64-w64-mingw32\lib"

按照以下顺序将以下库添加到项目属性 > C/C++ Build > 设置 > GCC C++ 链接器 > 库中: SLD2main SDL

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

将构建配置更改为 Debug_Windows。

关闭项目属性。

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

要运行程序,请右键单击项目并选择Run as > Run Configurations,然后选择为该构建创建的运行配置。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接