为什么我们在C / C ++中有两种库?

时间:2016-01-05 22:56:47

标签: c

有静态库,然后有共享库。 如果需要,是不是可以只拥有共享的并静态链接它们?

使用-fPIC进行一次编译,而不是一次浪费。 我不太了解汇编,但是不应该将可重新定位的代码转换为比重新编译所有内容快几个数量级的静态代码吗?

3 个答案:

答案 0 :(得分:6)

这部分是一个历史问题。一旦只有静态库。它们静态链接到系统编译的每个二进制文件。然而,这代表了维护噩梦等,如果修补或修改了库,则需要重新编译所有使用的包。

然后共享库解决了这些问题。现在针对您的问题,首先可以在静态链接库中进行一些重要的优化,这些优化不可能在动态库中执行,因此即使将动态库转换为静态库,它也可能效率低于静态库。代码首先静态编译。

其次,大多数现代系统无论如何都只使用共享库,所以没有太大的问题,事情只编译一次,作为共享库。

稍微偏轻一点,无论如何仍然相关,你可能会关注Plunker。这个步骤可以消除一些启动开销(但仍然不一定能达到与静态链接相同的性能),并允许动态链接库中的软件更快地启动。

答案 1 :(得分:1)

虽然从理论上讲,肯定可以将动态库后处理成静态库,但是这样一项任务的难度 - 特别是做得好 - 与从头开始编译相当。通过后处理获得与通过执行从头开始的静态构建相同的结果可能比简单地再次构建更困难,而且任何工具都会带来其自身的维护负担。为什么在已经有一个完美的方法达到同样的目标时去做呢?

此外,建立静态和共享库绝不是必需的。即使您想要这样做,这样做的增量成本(应该)也是整个开发时间的一小部分。

答案 2 :(得分:0)

如果希望可执行文件不依赖某个库,则可以使用静态库。基本上,库是在可执行文件中“运送”的。

当然,这是非常情境化的,因为大多数时候共享库都是可行的方式。