为什么gcc不支持将动态库链接到静态二进制文件

时间:2014-08-27 06:27:43

标签: c gcc shared-libraries static-linking

背景如下:第三方提供者在32b中为我们提供了libveryfancylib.so。使用该库的Softaware也有很多其他linux库依赖项(如QT),但它们是开源的,因此静态链接没有问题。目标平台是64b并运行Debian 7.

我们可以使用二进制+动态库发送程序,没问题,但我宁愿看到没有依赖的单个静态二进制文件。

所以我的问题是:为什么我不能将动态库链接到静态二进制文件?我的意思是缺少什么信息,或者只是很少需要的功能 - >没有实施。

3 个答案:

答案 0 :(得分:1)

  

我们可以使用二进制+动态库发送程序,没问题,但我宁愿看到没有依赖的单个静态二进制文件。

您要解决的问题是什么?

您可以按照Linux上大多数商业应用程序的模型执行操作:将可执行文件,共享库和其他资源放在一个目录中(可能包含子目录)。将可执行文件与这些共享库链接时,将-Wl,-rpath,'$ORIGIN'(在make use -Wl,-rpath,'$$ORIGIN'中)传递给链接器,以便在启动应用程序时,运行时链接程序在可执行文件所在的同一目录中查找所需的共享库。

然后归档该目录并将其提供给您的用户。

答案 1 :(得分:0)

因为动态库和静态库是两回事。静态库只是目标文件的存档(很像zip存档)。动态库更像是可执行程序。

因此,您无法任何内容链接到静态库中,您只能添加更多目标文件。

答案 2 :(得分:0)

MS Windows程序可以执行此操作,例如DLL to LibDLL to Static Lib

在开源世界中,开发这样一个工具并没有太大的动力,因为你总是可以从源代码重新编译(当然,无论如何,某个地方有人可能会这样做)。