【发布时间】: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或 settingrpathwhile 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