SDL2库的静态链接

时间:2013-07-12 17:42:11

标签: sdl codeblocks static-linking sdl-2

我正在使用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文件与可执行文件捆绑在一起才能使其正常工作。

我听说我不能静态链接动态库,所以我唯一的选择似乎是使用来自链接I的文件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的路径添加到编译器的搜索目录中,并将SDL2-2.0.0 \ build.libs的路径添加到链接器的搜索目录中。我还把它写到我的测试文件中:#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,而整个点是静态链接。

所以目前我有在我的链接库中设置/ .libs的路径 - 在其他链接器选项中的-lSDL2,对于搜索目录,我有编译器和SDL2的SDL2-2.0.0 / include路径链接器为-2.0.0 / build / .libs。

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

1 个答案:

答案 0 :(得分:15)

没有必要重新编译库, SDL2给出了名为“libSDL2.a”的静态链接库 在文件夹“SDL2-2.0.0 \ i686-w64-mingw32 \ lib \”。

请务必将这些选项添加到链接器:

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

代码上的

:“项目/构建选项...... /链接设置/其他链接器选项”中的块

这些选项允许您链接SDL2.dll正在使用的内容。

您可以在“SDL2-2.0.0 \ i686-w64-mingw32 \ bin \ sdl2-config”文件中检索它们

神奇的技巧是删除或重命名文件“libSDL2.dll.a” 在文件夹“SDL2-2.0.0 \ i686-w64-mingw32 \ lib \”上。 我之前加了一个“ - ”来保留它以防我需要它。

我不知道为什么这个图书馆能够克服另一个图书馆并且一条线索将会受到赞赏。

我尝试使用Code :: Blocks 12.11 MinGW32并且它有效。

如果你运行一些使用动态链接的项目 和其他一些使用静态链接,你将不得不 知道这一点,将你的图书馆保存在两个不同的文件夹中 “libSDL2main.a”将出现在这两个中。

对不起我的写作,我不习惯用英文写作。

麦克