首页 > 解决方案 > Linux 上的静态链接 SDL2

问题描述

我正在尝试在 Linux 上静态链接 SDL2,目的是创建一个不需要系统上需要任何库的二进制文件。我知道这将需要静态链接不仅仅是 SDL2,例如 SDL2 的依赖项和 libc 之类的东西,所以在这方面的帮助也将不胜感激。但现在我根本无法让 SDL2 静态链接。

我使用的是 GCC,以及我自己编译和安装的 SDL 2.0.16,默认配置包括静态库。我已经通过我的包管理器安装了 SDL2,所以我的安装去/usr/local/include/SDL2/usr/local/lib.

运行/usr/local/bin/sdl2-config --cflags --static-libs给出:

-I/usr/local/include/SDL2 -D_REENTRANT
-L/usr/local/lib -lSDL2 -lm -ldl -lpthread -lrt

不用再搞乱这些标志,并且-static能够生成不动态链接到 SDL2 的二进制文件。我该怎么做?

我出于其他原因使用的其他标志是-std=c89 -Wall -Wno-unknown-pragmas -DNDEBUG -Os -g0 -s

能够交叉编译并做到这一点会很棒,但我知道这要复杂得多。我一直在尝试编译,zig cc因为这将允许以后进行交叉编译,但无法让它工作。我能够得到一个没有动态链接到 SDL2 的构建,但它会出现段错误。


回应评论:

运行pkg-config --static --cflags --libs /usr/local/lib/pkgconfig/sdl2.pc给出:

-I/usr/local/include/SDL2 -D_REENTRANT -L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2 -lm -ldl -lpthread -lrt

使用它会创建一个动态链接的可执行文件,所以不是我想要的。如果我添加-static我得到错误:

/usr/bin/ld: /usr/local/lib/libSDL2.a(SDL_dynapi.o): in function `get_sdlapi_entry':
/home/makeworld/Software/SDL2-2.0.16/src/dynapi/SDL_dynapi.c:237: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

标签: cgccsdlstatic-librariessdl-2

解决方案


感谢@HolyBlackCat 和@keltar,我已经能够静态链接SDL2。

我基本上只是使用了pkg-config我的问题中提供的输出,但是在它-Wl,-Bstatic之前-lSDL2-Wl,-Bdynamic之后添加了它。这静态链接 SDL2,但动态链接所有其他库。

最后的命令是:

gcc your_code.c -o your_executable -I/usr/local/include/SDL2 -D_REENTRANT \
-L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags \
-Wl,-Bstatic -lSDL2 -Wl,-Bdynamic -lm -ldl -lpthread -lrt

如果您的 SDL2 版本安装在其他位置,只需将命令的/usr/local/include/SDL2/usr/local/lib部分更改为分别指向头文件和.a文件的位置。


如果我弄清楚如何交叉编译这个设置,我会更新这个答案。


推荐阅读