16

我正在使用 Windows 7、Code::Blocks 和 MinGW。在编译/构建任何东西时,我几乎没有经验,尤其是当 Code::Blocks 不使用 makefile 时。

我从http://www.libsdl.org/tmp/download-2.0.php下载了 SDL2-devel-2.0.0-mingw.tar.gz (SDL 开发库),我想创建一个独立的可执行文件使用SDL2 库,但到目前为止,我总是必须将 SDL2.dll 文件与可执行文件捆绑在一起才能使其工作。

我听说我不能静态链接动态库,所以我唯一的选择似乎是使用上面提到的链接中的文件 SDL2-2.0.0.tar.gz(源代码)对源文件做一些事情。但是,我不知道我应该如何处理这些。

我设法使用源文件尝试将 Visual Studio 项目导入 Code::Blocks 并构建它,但它告诉我“sdl-config 没有这样的文件或目录”(我不知道是什么触发了它)。我也不确定构建是否只是给了我一个可执行文件,我不知道我可以做些什么来将它链接到我自己的可执行文件。

一个万无一失的白痴的分步指南将是解决此案的最佳选择。

编辑:

我设法使用 Jonas 提供的指南编译了 SDL 库,并获得了一个 libSDL2.a 文件。

起初我只将 libSDL2.a 的路径添加到“链接库:”-Code::Blocks 部分,但我遇到了一堆错误,例如“SDL_Init() 未在此范围内声明”。

除了 libSDL2.a 路径,我还添加了 SDL2-2.0.0\include 的路径到 Compiler 的搜索目录,以及 SDL2-2.0.0\build.libs 的路径到 Linker 的搜索目录。我还将它写到我的测试文件中:#include "SDL.h"。我的测试文件现在看起来像这样:

#include "SDL.h"

int main( int argc, char* args[] ) {
    //Start SDL
    SDL_Init( SDL_INIT_EVERYTHING );
    //Quit SDL
    SDL_Quit();
    return 0;
}

看来它确实解决了声明问题,但现在 Code::Blocks 打开了一个 SDL_mmjoystick.c 文件并给了我更多错误:“未定义对'waveInClose@4'的引用”、“对'waveOutClose@4'的未定义引用”、 “对'joyGetNumDevs@0'的未定义引用”和其他大量引用。

这是正在发生的事情的屏幕截图,注意#include 文本的不同颜色,我不确定为什么会发生这种情况:http: //gyazo.com/00656a9c1e57a2bd0db1414fa7d68ced.png

我不确定如何正确使用这个库。在这种情况下有什么帮助,还是我应该为此提出另一个问题?

编辑:

我将 -lSDL2 添加到链接器选项并删除了其他参数。现在它构建良好:

mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\thetestfile.cpp" -o obj\Debug\thetestfile.o
mingw32-g++.exe -LC:\Users\User\Desktop\SDL2-2.0.0\build\.libs  -o "bin\Debug\SDL project.exe" obj\Debug\main.o obj\Debug\thetestfile.o   -lSDL2  ..\..\SDL2-2.0.0\build\.libs\libSDL2.a C:\Users\User\Desktop\SDL2-2.0.0\build\.libs\libSDL2.a  -mwindows
Output size is 945.80 KB
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings (0 minutes, 1 seconds)

但是当我尝试运行它时,它说我的计算机缺少 SDL2.dll,而重点是静态链接。

因此,目前我的链接库 -settings 中有 build/.libs 的路径,其他链接器选项中有 -lSDL2,对于搜索目录,我有编译器和 SDL2-2.0 的 SDL2-2.0.0/include 的路径。 0/build/.libs 用于链接器。

在 build/.libs 目录中我还可以看到 libSDL2.a、libSDL2.dll.a、libSDL2.la 和 libSDL2.lai 文件,我不知道它们是什么。

4

1 回答 1

25

It's not necessary to recompile the library, SDL2 is given with static-link library named "libSDL2.a" on the folder "SDL2-2.0.0\i686-w64-mingw32\lib\".

Just be sure to add these options to the linker :

"-lmingw32 -lSDL2main -lSDL2 -mwindows -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -static-libgcc"

on Code:Blocks at "Project / Build Options... / Linket settings / Other linker options"

These options allow you to link with what SDL2.dll was using.

You can retreive them on the file "SDL2-2.0.0\i686-w64-mingw32\bin\sdl2-config"

The magical trick is to delete or rename the file "libSDL2.dll.a" on the folder "SDL2-2.0.0\i686-w64-mingw32\lib\". I added a "-" before to keep it in case I need it.

I don't know why this librairy overcomes the other and a clue would be appreciated.

I tried with Code::Blocks 12.11 MinGW32 and it worked.

If you run with some projects that use dynamic-link and some other which use static-link, you will have to keep your librairies in two different folders knowing that "libSDL2main.a" will be in those two.

Sorry for my writing, I'm not used to write in english.

Mike

于 2013-09-01T19:17:52.080 回答