未定义对SDL_Init的引用

7

我今天开始使用SDL,之前遇到一些问题,现在已经解决了,但是还不能初始化它。

这是我的代码:

#include <iostream>
#include "SDL.h"
#undef main

using namespace std;

int main(){
    if(SDL_Init(SDL_INIT_EVERYTHING)<0){
        cout << "error starting sdl" << endl;
    }
    return 0;
}

这是构建日志:
-------------- Build: Debug in Graphics (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -g -std=c++11 -IC:\Users\73638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\include\SDL2 -I"C:\Users\73638G75MA\Documents\C++ projects\Graphics" -c "C:\Users\73638G75MA\Documents\C++ projects\Graphics\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\73638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\lib -o bin\Debug\Graphics.exe obj\Debug\main.o  -lmingw32 -lSDL2main -lSDL2  
obj\Debug\main.o: In function `main':
C:/Users/73638G75MA/Documents/C++ projects/Graphics/main.cpp:8: undefined reference to `SDL_Init'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

我希望你能帮助我翻译以下内容,这与IT技术有关。在开头的#undef main是因为如果没有它,它就不会让我运行程序。如果没有它,它会给我一个“未定义的引用winmain@16”,而我正在创建控制台应用程序。

5个回答

8
根据包含和库搜索路径 ...\SDL2-2.0.3\x86_64-w64-mingw32\...,您正在尝试使用64位SDL2进行构建。根据 Code::Blocks下载页面 和我对codeblocks-13.12mingw-setup.exe内容的检查,所包含的工具链仅支持32位,并且无法创建64位二进制文件或使用64位库。

如果您想使用预构建的SDL2,则需要下载匹配的工具链(64位mingw-w64)并使用它,或更改构建参数以使用32位版本的SDL2(在 开发库存档 中的 i686-w64-mingw32 目录中可找到)。

4
以下方法经过我一番艰苦的尝试后才得以奏效:
g++ -std=c++17 Test.cpp -I"include" -L"lib" -Wall -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -o Test

以下是一些重要的事情,你可能没有意识到:

  • "-l" 标记需要放在最后。
  • 即使使用 mingw-w64 64位编译器,"-lmingw32" 标记也必须存在。请注意,我不知道为什么,但我尝试了一下,如果没有它就无法正常工作。
  • 你的主函数必须是 int main(int argc, char* argv[]) {,因为SDL需要找到它来接管程序。

我的文件结构如下:

Test/
  include/
    SDL.h
    SDL_main.h
    SDL_image.h
    ...
  lib/
    libSDL2.a
    libSDL2.dll.a
    libSDL2_image.a
    ...
  licenses/
  Test.exe
  SDL2.dll
  SDL2_image.dll
  zlib1.dll
  Test.cpp
  sdl2-config

请注意,我的命令行当前目录为Test。
还要注意,我将mingw-w64 g++可执行文件的文件夹添加到了环境变量路径中。
还要注意,上面结构中的...表示应该有更多内容,并且它们来自于SDL提供给您的x86_64文件夹。

我已经尝试了5个小时来解决这个问题。我只是复制了你的项目结构来适应我的...结果,它奏效了。谢谢:)) - user7800326

3
在终端或命令提示符中使用以下代码。
gcc main.c -lSDL2 -lSDL2main -o main

"main.c"是您的文件名。

2
您这里有几个错误。
1.
不要undef main,只是因为您不知道它在这里的原因!当您使用SDL时,main()(几乎)总是必须像int main(int, char **) {}这样。所以,请删除#undef main并将int main()更改为int main(int, char **)。
2.
构建x32可执行文件时,必须使用i686-w64-mingw32的内容,而不是x86_64-w64-mingw32的内容。因此,请适当调整编译标志。
x86_64-w64-mingw32可能是用于x64应用程序的,但我认为您正在构建x32应用程序。

0

这对我有用...前往设置->编译器->链接器设置->在其他链接器选项框中粘贴以下内容 -lmingw32 -lSDL2main -lSDL2


1
请将以下与编程��关的内容从英语翻译成中文。仅返回翻译后的文本:请确保在回答中使用代码框来放置代码/命令。 - finnmglas

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