分发 Linux 应用程序时,您可以将动态库与二进制文件一起包含吗?

分发 Linux 应用程序时,您可以将动态库与二进制文件一起包含吗?

关于分发 Linux 应用程序的愚蠢问题。我知道我们有 Flatpak 可以做到这一点,但我很好奇。

假设您正在创建一个依赖于某些动态依赖项的 GUI 应用程序。据我了解,Flatpak 会将这些依赖项包含在您的应用程序映像中,以便它们与系统可用的依赖项分开。

deb此外,像和这样的打包格式rpm将触发包管理器下载缺少的共享库。

也就是说,您可以将可执行文件与动态库(包含在tar.gz人们下载的存档中)一起分发吗?

/myapp.tar.gz
  /bin
    myapp
  /lib
    libssl3.so
    qt5

那么人们是否可以将其解压到某个地方并运行可执行文件,而无需包管理器或容器解决方案?

从字面上看

curl -L --url https://.../linux-amd64.tar.gz | tar -xvzf - -C $HOME/.local/myapp
$HOME/.local/myapp/bin/myapp

也许可执行文件可以首先使用系统提供的依赖项,如果不存在则使用本地依赖项?

这种方法有效吗?

如果它确实有效,为什么开发人员不这样做,而是通过多种包格式进行分发?

以这种方式分发库是否违反了 OSS 许可条款?

答案1

你绝对可以这样做,但要成功启动应用程序,ld-linux就需要找到库。

这可能很简单,只需提供一个启动器脚本来设置 LD_SEARCH_PATH 以包含文件所在的目录,或设置 LD_PRELOAD 来强制加载它们。

可以通过将目录放在 LD_SEARCH_PATH 中的系统库目录之后来确定依赖项的顺序

因此$HOME/.local/myapp/bin/myapp被替换为sh设置一些变量的脚本文件,exec然后 $HOME/.local/myapp/bin/myapp.bin$HOME/.local/myapp/lib/myapp.bin

阅读 ld-linux 的手册页以了解更多信息。

许可,您需要阅读许可证,但大多数图书馆许可证都允许这样做。

相关内容