【问题标题】:Linking SDL2 statically without pulling in X11 dynamically静态链接 SDL2 而不动态拉入 X11
【发布时间】:2020-12-09 18:04:20
【问题描述】:

我在 Ubuntu 20.04 上使用 SDL2.0.12。我静态链接到SDL2,添加链接器参数:

`sdl2-config --static-libs`

到目前为止,一切都很好。

然而,SDL 静态链接标志引入了大量的 SDL2 依赖项,它们动态链接的:

$ sdl2-config --static-libs
-lSDL2 -Wl,--no-undefined -lm -ldl -lasound -lm -ldl -lpthread -lpulse-simple -lpulse -lX11 -lXext -lXcursor -lXinerama -lXi -lXrandr -lXss -lXxf86vm -lwayland-egl -lwayland-client -lwayland-cursor -lxkbcommon -lpthread -lrt

这给我留下了许多其他 Linux 发行版上可能不存在的动态依赖项:

readelf -d foo | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libGL.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libSDL2-2.0.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libasound.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libpulse-simple.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libpulse.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libX11.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libXext.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libXcursor.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libXinerama.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libXi.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libXrandr.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libXss.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libXxf86vm.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libwayland-egl.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libwayland-client.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libwayland-cursor.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libxkbcommon.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

如何摆脱这些动态依赖关系?

对于初学者,我如何才能静态链接到 X11?

【问题讨论】:

  • 我对此不太熟悉,但我听说来自 Ubuntu repos 的 SDL2 被配置为无条件地需要一些依赖项(如您所见),同时使用默认源自己构建它设置将使它决定在运行时加载什么,这取决于系统中存在哪些库。 (那么你不需要静态链接 X11 或其他任何东西。)例如对于我定制的 SDL2 pkg-config sdl2 --libs --static 报告 -lSDL2 -Wl,--no-undefined -lm -ldl -lpthread -lrt,同样readelf -d libSDL2-2.0.so.0 只报告那些库而不报告 X11。

标签: static-libraries sdl-2 static-linking


【解决方案1】:

Ubuntu 中提供的 SDL 开发库有很多动态依赖。即使是静态的libSDL2.a 库。

从源代码构建 SDL2 时,您可以避免这些。

例如,为了避免对 X11 的依赖,您可以为其提供以下 autoconf 标志:

./configure \
        --enable-x11-shared \
        --enable-video-x11 \

--enable-x11-shared 实际上会在运行时在该依赖项中创建 SDL2 链接。而不是,如您所料,链接到 X11 .so 依赖项。

【讨论】:

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