SDL2 库的静态链接
Posted
技术标签:
【中文标题】SDL2 库的静态链接【英文标题】:Static-linking of SDL2 libraries 【发布时间】:2013-07-11 08:21:56 【问题描述】:我使用的是 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的路径添加到“Link libraries:”-code::Blocks部分,但我遇到了一堆错误,例如“SDL_Init() not declared in this scope”。
除了 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 的 SDL2-2.0.0/include 的路径-2.0.0/build/.libs 用于链接器。
在 build/.libs 目录下我还可以看到 libSDL2.a、libSDL2.dll.a、libSDL2.la 和 libSDL2.lai 文件,我不知道它们是什么。
【问题讨论】:
如果您将 libsdl2.a 显式传递给链接器,则可以删除-lSDL2
。
【参考方案1】:
不需要重新编译库, 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”将在这两个中。
对不起我的写作,我不习惯用英文写作。
迈克
【讨论】:
仅供参考 - 在处理这个问题时,我发现如果你在链接时将“-static”添加到命令行,它将强制 mingw 链接器优先使用静态库而不是动态库,所以您无需删除或重命名 libSDL2.dll.a 文件即可使其工作。 非常感谢您的回答。这就是我一直在寻找的东西!另外,如果有人知道他是怎么想出来的,也请告诉我!以上是关于SDL2 库的静态链接的主要内容,如果未能解决你的问题,请参考以下文章