Linux 如何静态链接复杂程序

Linux 如何静态链接复杂程序,linux,static,linker,Linux,Static,Linker,在Linux中,下载了一个程序源并希望它被静态链接。 有一个巨大的Makefile, 我 编译。 这个问题有点太笼统了,但是如何使二进制静态链接 编辑:这样做的原因是希望确保二进制文件 没有依赖项(或至少尽可能少),因此可以在任何基于Linux的计算机上运行,即使没有Internet连接,也可以在未更新的Linux上运行。是的,您需要编辑make文件,并在链接期间将-static参数添加到gcc中。我假设它使用gcc编译一系列c程序,尽管您必须查看Makefile才能找到答案 如果是这样,您可以

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

编译。 这个问题有点太笼统了,但是如何使二进制静态链接

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

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

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

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

我想知道你为什么静态链接。您是否考虑过改用预链接


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

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

 ./configure --enable-static
 make
如果这不起作用,您可以通过
LDFLAGS
传入链接器标志,如下所示:

 ./configure LDFLAGS=-static

如果你不能编译静态二进制文件,我已经用它得到了很好的结果。

回答得很好,不幸的是,这两个原因都不起作用。从我理解的,它是不起作用的,因为我缺少静态库来连接。在CENTOS上,你需要为静态链接安装的包是C++的代码> GLYBC静态< /代码>和<代码> LBSTDC++-static < /C>用于C++静态链接。看,这个答案并不完全正确
--enable static
标志仅适用于库,它表示“生成此库的支持静态的版本(可能是支持动态的版本之外)”。动态版本(使用
--启用共享
启用)是
。因此对于Linux是
。对于Mac是
。dylib是
,而静态版本通常是
。a
。仅供参考如果
LDFLAGS
方法不起作用,请添加另一个短划线
/configure LDFLAGS='--static'
。这可能适用于某些项目,例如
procps
极好的想法。我有一个类似的产品非常好的结果。静态链接被认为是有害的!对不起,这不是对你问题的直接回答,但我只是想指出一点。
 ./configure LDFLAGS=-static