我的 SDL2 程序需要哪些二进制文件才能在未安装 SDL2 的另一台计算机上运行
What are the binaries files needed to my SDL2 program so it works in another computer without SDL2 installed
我的基于 SDL2 的程序必须附带哪些二进制文件才能在未安装 SDL 的另一台计算机上运行?
我的程序所需的库:
iostream
SDL2/SDL.h
SDL2/SDL_image.h
ctime
cstdlib
我已经尝试使用的二进制文件:
libSDL2.so
libSDL2-2.0.so.0.8.0
libSDL2_image.so
libSDL2_image-2.0.so.0.2.1
PS: 我正在测试我的程序包是否适用于可启动的 Xubuntu 笔式驱动器
简短的回答是 "use ldd"。长答案如下。
ldd ./your_program
将显示所有 运行 时间依赖项的递归列表(您的和您使用的每个库的依赖项,以及它们的依赖项,...)。
readelf -d ./your_program | grep NEEDED
将显示您的直接依赖项(只有您的程序实际链接的那些 - 并不一定意味着您只能复制那些)。
LD_DEBUG
envvar 可用于跟踪在 运行 时间加载了哪些库(例如 dlopen
)。
如果您针对一个特定的发行版,那么构建具有指定依赖项的包可能会更简单,例如apt
将为您安装 SDL。
下一个大问题是您从哪里获得 SDL。许多发行版禁用 SDL 动态加载器,因此它不会 运行 没有例如libX11
, wayland, libXi, pulseaudio, ... 发行版这样做是非常好的,因为它从来没有打算让你只是将一些库复制到另一台机器上。如果您自己构建它,您可以拥有更少的直接依赖关系,SDL 将尝试 dlopen
它需要的任何东西。 SDL2_image 可能是更简单的示例 - 它可能依赖于 libjpeg、libpng、libz、...,您可能不需要某些格式,但如果您已链接到这些库,则无法 运行 没有他们。
考虑您可以考虑哪些库 'always there'。例如。携带 libX11 或 libc 以及许多其他软件是没有意义的。这部分为所有 OS 共享 - 由于多种原因,您的程序无法获得 OS 的一半。
总结一下,使用启用动态加载的 SDL 构建(我认为它现在是默认设置已经有一段时间了),复制 SDL/SDL_image,使用 LD_LIBRARIES_PATH
设置你的库位置,验证列出 ldd
,你应该没问题。不要复制libc、libstdc++、libpthread、libm。
我的基于 SDL2 的程序必须附带哪些二进制文件才能在未安装 SDL 的另一台计算机上运行?
我的程序所需的库:
iostream
SDL2/SDL.h
SDL2/SDL_image.h
ctime
cstdlib
我已经尝试使用的二进制文件:
libSDL2.so
libSDL2-2.0.so.0.8.0
libSDL2_image.so
libSDL2_image-2.0.so.0.2.1
PS: 我正在测试我的程序包是否适用于可启动的 Xubuntu 笔式驱动器
简短的回答是 "use ldd"。长答案如下。
ldd ./your_program
将显示所有 运行 时间依赖项的递归列表(您的和您使用的每个库的依赖项,以及它们的依赖项,...)。
readelf -d ./your_program | grep NEEDED
将显示您的直接依赖项(只有您的程序实际链接的那些 - 并不一定意味着您只能复制那些)。
LD_DEBUG
envvar 可用于跟踪在 运行 时间加载了哪些库(例如 dlopen
)。
如果您针对一个特定的发行版,那么构建具有指定依赖项的包可能会更简单,例如apt
将为您安装 SDL。
下一个大问题是您从哪里获得 SDL。许多发行版禁用 SDL 动态加载器,因此它不会 运行 没有例如libX11
, wayland, libXi, pulseaudio, ... 发行版这样做是非常好的,因为它从来没有打算让你只是将一些库复制到另一台机器上。如果您自己构建它,您可以拥有更少的直接依赖关系,SDL 将尝试 dlopen
它需要的任何东西。 SDL2_image 可能是更简单的示例 - 它可能依赖于 libjpeg、libpng、libz、...,您可能不需要某些格式,但如果您已链接到这些库,则无法 运行 没有他们。
考虑您可以考虑哪些库 'always there'。例如。携带 libX11 或 libc 以及许多其他软件是没有意义的。这部分为所有 OS 共享 - 由于多种原因,您的程序无法获得 OS 的一半。
总结一下,使用启用动态加载的 SDL 构建(我认为它现在是默认设置已经有一段时间了),复制 SDL/SDL_image,使用 LD_LIBRARIES_PATH
设置你的库位置,验证列出 ldd
,你应该没问题。不要复制libc、libstdc++、libpthread、libm。