SDL2库的静态链接

22

我正在使用Windows 7、Code::Blocks和MinGW。在编译/构建任何东西方面,我几乎没有什么经验,特别是当Code::Blocks不使用makefiles时。

我从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 No such file or directory”(我不知道是什么触发了这个)。而且,我也不确定编译是否只给我一个可执行文件,我也不知道我可以用它来链接到自己的可执行文件。

一个傻瓜式的逐步指南可能是解决此问题的最佳选择。

编辑:

我成功地使用Jonas提供的指南编译了SDL库,并得到了一个libSDL2.a文件。

起初,我只将libSDL2.a的路径添加到Code::Blocks的“链接库:”部分,但我遇到了一堆错误,如“SDL_Init() not declared in this scope”。

除了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-2.0.0/include的路径,链接器中有SDL2-2.0.0/build/.libs的路径。

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


如果您明确地将libsdl2.a传递给链接器,那么可以省略“-lSDL2”。 - greatwolf
1个回答

30

不需要重新编译库文件,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"

在Code:Blocks中,“项目/构建选项.../链接器设置/其他链接器选项”。

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

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

神奇的技巧是删除或重命名文件夹“SDL2-2.0.0\i686-w64-mingw32\lib\”中的“libSDL2.dll.a”。我在前面加了一个“-”以备不时之需。

我不知道为什么这个库会取代另一个库,如果有线索,请告诉我。

我使用Code::Blocks 12.11 MinGW32尝试过,它可行。

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

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

迈克


13
在处理这个问题时,我发现如果在链接时在命令行中添加“-static”,它会强制mingw链接器优先选择静态库而不是动态库,因此您无需删除或重命名libSDL2.dll.a文件即可使它正常工作。 - Syndog
1
非常感谢您的回答。这正是我寻找已久的答案!如果有人知道他是如何想出来的,请也告诉我! - stanle

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