c - 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
解决方案
感谢@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
文件的位置。
如果我弄清楚如何交叉编译这个设置,我会更新这个答案。
推荐阅读
- docker - 如何自动更新 docker 容器中的 jenkins 插件?
- latex - 如何修复 y 轴上的重叠标签 - Latex
- r - ggplot2:结合定位命令 position_nudge 和 position_stack
- php - 限制 for 循环
- javascript - d3js一直阻止forceSimulation重新计算位置
- html - 如何使用附近的动态宽度按钮使标题居中?
- reactjs - 未定义此类颜色时以靛蓝渲染的 Material-UI 样式组件
- mysql - 无法通过 Ruby 和 MySQL2 连接到数据库
- javascript - CanvasJS 图表无法使用幻灯片/轮播容器正确呈现
- fortran - Undefined reference to module subroutines matching an abstract interface