有静态库,然后有共享库。 是否可以只拥有共享的并在需要时静态链接它们?
用 -fPIC
编译一次,不编译一次似乎是一种浪费。
我对汇编了解不多,但将可重定位代码转换为静态代码的速度难道不应该比重新编译所有内容快几个数量级吗?
最佳答案
这在一定程度上是一个历史问题。曾经只有静态库。它们静态链接到系统编译的每个二进制文件。然而,这代表了维护的噩梦,如果库被修补或更改,则需要重新编译所有使用的包。
然后共享库出现并解决了这些问题。现在针对您的问题,首先,在静态链接库中可以进行一些重要的优化,这是不可能在动态链接库上执行的,因此即使将动态库转换为静态库,它的效率也可能低于首先静态编译的代码。
其次,大多数现代系统无论如何都只使用共享库,所以没有太大问题,东西只编译一次,作为共享库。
顺便说一句,但仍然相关,您可能会查看 prelinking .这一步骤消除了一些启动开销(尽管仍未必达到与静态链接相同的性能)并允许在库中动态链接的软件更快地启动。
关于c - 为什么我们在C/C++中有两种库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622769/