【问题标题】:How to statically-link a complex program如何静态链接复杂程序
【发布时间】:2010-11-02 06:45:34
【问题描述】:

在 Linux 中,下载了一个程序源并希望它被静态链接。 那里有一个巨大的 Makefile, 我

./configure
make

编译。 prehpes 这有点太笼统了,但是我怎样才能使二进制文件静态链接?

编辑:这样做的原因是要确保二进制文件将 没有依赖项(或至少尽可能少),因此可以在任何基于 Linux 的计算机上运行,​​即使是没有 Internet 连接和未更新 Linux 的计算机。

【问题讨论】:

标签: linux static linker


【解决方案1】:

大多数autoconf 生成的configure 脚本将允许您进行静态构建:

 ./configure --enable-static
 make

如果这不起作用,您可以通过LDFLAGS 传递链接器标志,如下所示:

 ./configure LDFLAGS=-static

【讨论】:

  • 很好的答案,不幸的是由于某种原因两者都不起作用。
  • 据我了解,它不起作用,因为我缺少要链接的静态库。
  • 在 CentOS 上,你需要为静态链接安装的软件包是 glibc-static 用于 c 和 libstdc++-static 用于 c++ 静态链接。见this post for more info
  • 这个答案并不完全正确。 --enable-static 标志仅适用于库,它的意思是“构建此库的静态版本(可能除了动态版本之外)”。动态版本(使用--enable-shared 启用)对于Linux 是.so,对于Mac 是.dylib,静态版本通常是.a
  • 仅供参考,如果 LDFLAGS 方法不起作用,请在前面添加另一个破折号。 ./configure LDFLAGS='--static'。这可能适用于某些项目,例如procps
【解决方案2】:

是的,你需要编辑make文件并在链接期间将-static参数添加到gcc。

【讨论】:

    【解决方案3】:

    我假设它使用 gcc 来编译一系列 c 程序,尽管您必须查看 Makefile 才能找到。

    如果是这样,您可以调整 makefile 中的 gcc 行以进行静态链接,尽管取决于程序的结构,这可能是一个复杂的更改。看看 man gcc 看看这是怎么做到的。

    我很想知道您为什么要进行静态链接。您是否考虑过使用预链接?

    您应该知道,如果所有组件都不是 GPL,那么执行此操作可能会出现许可问题。

    【讨论】:

      【解决方案4】:

      如果您无法编译静态二进制文件,我使用 Statifier 获得了不错的结果。

      【讨论】:

      • 好主意。我用类似的产品取得了非常好的结果。
      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2013-08-26
      • 2011-03-31
      • 1970-01-01
      • 2022-01-23
      • 2019-07-05
      • 2013-02-26
      相关资源
      最近更新 更多