最近,我一直在编译和分发软件。上次我这样做时,我通过构建程序并在其上运行 ldd 来获取它所链接的所有库。我获得了库的路径(例如/lib/x86_64-linux-gnu/libc.so.6
),然后从我的系统中复制并粘贴了它。它工作得很好,但手动复制和粘贴每个库似乎很重复。有没有办法让我只获得库路径的列表(没有所有的libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1dc3333000)
),以便我可以复制它们并将它们与我的构建一起分发?
答案1
此时,您基本上是在构建整个 Linux 发行版的 tarball。根据您链接到的库,仅包含动态库本身可能还不够(某些库依赖于插件模块和其他外部文件,这些文件在所有 Linux 发行版中安装的位置和版本并不相同)。
有几种方法可以解决这些差异:
- 分发您的程序的源代码并让那些接受分发的人,以便用户可以在他们选择的分发版本上自己编译它。
- 为您希望支持的每个不同 Linux 发行版的每个不同版本重新编译程序的版本,并将您的程序分发到这些发行版和版本的软件包中。
- 使用静态链接而不是动态链接来编译应用程序。但是,如果链接到依赖于外部模块或文件的库,这仍然可能存在问题。
- 分发您希望支持的特定 Linux 发行版的 VM 映像,该映像是最小安装,并且默认安装了您的程序,以提供完整的运行环境。
答案2
我已经弄清楚了(大部分)。
假设我计划分发的程序位于 /bin/bash。我可以创建一个新目录并运行以下命令:
cp $(ldd /bin/bash) ./
这会出现一些错误消息,但可以忽略。