对 SDL_Init 的未定义引用
undefined reference to SDL_Init
我今天开始使用 SDL,之前遇到了一些麻烦,现在我明白了 运行ning 但它不让我初始化它。
这是我的代码:
#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:\Users638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\include\SDL2 -I"C:\Users638G75MA\Documents\C++ projects\Graphics" -c "C:\Users638G75MA\Documents\C++ projects\Graphics\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users638G75MA\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))
我会感谢所有可能的帮助,开头的 #undef main 是因为它不会让我 运行 否则。如果它不存在,它会在我创建控制台应用程序时给我一个 "undefined reference to winmain@16"。
根据包含和库搜索路径 ...\SDL2-2.0.3\x86_64-w64-mingw32\...
,您正在尝试使用 64 位 SDL2 进行构建。 从编译器名称 mingw32-g++
判断,我认为您使用的是 mingw.org 工具链 根据 Code::Blocks download page 和我对内容的检查codeblocks-13.12mingw-setup.exe,包含的工具链仅为 32 位,不能创建 64 位二进制文件,也不能使用 64 位库。
如果您想使用预构建的 SDL2,您需要下载匹配的工具链(64 位 mingw-w64)并使用它,或者更改构建参数以使用 32 位构建的 SDL2 (它存在于 i686-w64-mingw32
目录的 development libraries archive 中。
这里有几个错误。
1.
不要因为不知道它为什么在这里而取消定义 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 应用程序。
经过一番努力修改后,以下内容对我有用:
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++ 可执行文件的文件夹。
另请注意,上面结构中的 ...s 意味着应该有更多内容,它们来自 SDL 给您的 x86_64 文件夹。
这对我有用....去
设置->编译器->链接器设置->在其他链接器选项框中粘贴以下内容
-lmingw32 -lSDL2main -lSDL2
在终端或命令提示符下使用下面的代码
gcc main.c -lSDL2 -lSDL2main -o main
“main.c”是您的文件名
我今天开始使用 SDL,之前遇到了一些麻烦,现在我明白了 运行ning 但它不让我初始化它。
这是我的代码:
#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:\Users638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\include\SDL2 -I"C:\Users638G75MA\Documents\C++ projects\Graphics" -c "C:\Users638G75MA\Documents\C++ projects\Graphics\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users638G75MA\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))
我会感谢所有可能的帮助,开头的 #undef main 是因为它不会让我 运行 否则。如果它不存在,它会在我创建控制台应用程序时给我一个 "undefined reference to winmain@16"。
根据包含和库搜索路径 ...\SDL2-2.0.3\x86_64-w64-mingw32\...
,您正在尝试使用 64 位 SDL2 进行构建。 从编译器名称 根据 Code::Blocks download page 和我对内容的检查codeblocks-13.12mingw-setup.exe,包含的工具链仅为 32 位,不能创建 64 位二进制文件,也不能使用 64 位库。mingw32-g++
判断,我认为您使用的是 mingw.org 工具链
如果您想使用预构建的 SDL2,您需要下载匹配的工具链(64 位 mingw-w64)并使用它,或者更改构建参数以使用 32 位构建的 SDL2 (它存在于 i686-w64-mingw32
目录的 development libraries archive 中。
这里有几个错误。
1.
不要因为不知道它为什么在这里而取消定义 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 应用程序。
经过一番努力修改后,以下内容对我有用:
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++ 可执行文件的文件夹。
另请注意,上面结构中的 ...s 意味着应该有更多内容,它们来自 SDL 给您的 x86_64 文件夹。
这对我有用....去 设置->编译器->链接器设置->在其他链接器选项框中粘贴以下内容 -lmingw32 -lSDL2main -lSDL2
在终端或命令提示符下使用下面的代码
gcc main.c -lSDL2 -lSDL2main -o main
“main.c”是您的文件名