【问题标题】:Static link SDL2 on LinuxLinux 上的静态链接 SDL2
【发布时间】:2021-09-13 06:11:12
【问题描述】:

我正在尝试在 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 的构建,但它会出现段错误。


回应cmets:

运行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

【问题讨论】:

  • 试试pkg-config --static --libs sdl2,以防万一。另外,您是如何确定它与 SDL2 动态链接的?此外,您还可以选择使用二进制文件提供动态库,同时设置 LD_LIBRARY_PATH 或 setting rpath while building。
  • 有些发行版默认只提供 .so 文件,你能确认/usr/local/lib 中有一个用于 SDL 的 .a 文件吗?
  • @HolyBlackCat 我为pkg-config 更新了我的问题。我确定与ldd 和/或file 的动态链接。至于运送动态库,我该怎么做?谢谢。
  • @Tzig 是的,有一个.a 文件。我没有使用 SDL2 的发行版,而是我自己编译的,默认包含静态库。
  • @makeworld -static 是构建静态可执行文件(即根本不链接动态库)。您可能已经注意到,SDL 经常使用dlopen(事实上,即使您使用它进行静态链接,最终用户仍然可以加载他们自己更新的 SDL)。要仅链接几个静态库,您需要做一些思考,例如 -Wl,-Bstatic -lSDL2 -Wl,-Bdynamic -lrest_of_dynamic_libs_you_require(最值得注意的是,-ldl)。

标签: c gcc sdl static-libraries sdl-2


【解决方案1】:

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

我基本上只是使用了我的问题中提供的pkg-config 的输出,但是在-lSDL2 之前添加了-Wl,-Bstatic,在它之后添加了-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 文件的位置。


如果我知道如何交叉编译这个设置,我会更新这个答案。

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2020-02-09
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多