SDL2库的静态链接

Dis*_*pEd 12 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文件与可执行文件捆绑在一起以使其工作.

我听说我不能静态链接动态库,所以我唯一的选择似乎是使用上面提到的链接中的文件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;
}
Run Code Online (Sandbox Code Playgroud)

它似乎确实解决了声明问题,但现在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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 15

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

只需确保将这些选项添加到链接器:

"-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"上检索它们

神奇的技巧是删除或重命名文件"libLDL2.dll.a"文件夹"SDL2-2.0.0\i686-w64-mingw32\lib \".我之前添加了一个" - ",以防万一我需要它.

我不知道为什么这个图书馆克服了另一个,一条线索将不胜感激.

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

如果你运行一些使用dynamic-link的项目和一些使用static-link的项目,你必须将你的librairies保存在两个不同的文件夹中,知道"libSDL2main.a"将在这两个文件夹中.

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

麦克风

  • 仅供参考 - 在处理此问题时,我发现如果在链接时向命令行添加"-static",它将强制mingw链接器在动态上支持静态库,因此您不必删除或重命名libSDL2.dll.a文件以使其工作. (7认同)