使用预编译静态库相比直接包含源代码有哪些优势?

6
我能想到的唯一好处是编译速度。两种情况下的最终结果(二进制大小和速度)应该是相同的(当然,如果静态库没有进行优化编译,则除外)。同时,也希望提供一些参考资料。
更新:当我们需要在项目中包含小的第三方开源库时,这个问题就出现了。一位开发者声称,包含预编译的静态库(而不只是复制源文件)会提高应用程序的性能。我认为这样做没有道理。
因此,问题是:包含预编译库是否真的会提高最终应用程序的性能?
1个回答

3
如果您在谈论第三方库,那么它们的一些优点是:无需发布源代码,(潜在地)简化了最终开发人员的安装...尽管有时候这可能会变得更加麻烦,特别是如果没有正确处理(链接其他开源项目而不修复符号,支持错误的体系结构)。
如果您只是在创建自己的代码 - 看起来您只是给自己制造麻烦。如果文件没有改变,它们将已经在磁盘上编译(.o),除非您进行清理/重新构建所有操作,否则编译器将不需要重新编译它们。因此,您可能不会获得编译速度。
无论哪种方式 - 是的,输出应该是相同的。静态链接库只是您直接链接到的相同.o文件的集合。
编辑:
具体针对.o与.a速度的问题 - .a只是为了在开发期间方便打包而形成的.o文件集合。一旦链接,结果是相同的。我刚做了一个快速的健全测试来验证:
$ cat a.c
#include <stdio.h>

extern char *something();

int main()
{
    printf("%s", something());
    return 0;
}
$ cat b.c
char *something()
{
    return "something fancy here\n";    
}

$ gcc -c -o a.o a.c
$ gcc -c -o b.o b.c
$ gcc -o foo1 a.o b.o
$ ar -r b.a b.o
ar: creating archive b.a
$ gcc -o foo2 a.o b.a
$ cmp foo1 foo2

现在您已经知道了,通过链接.o和.a文件可以得到相同的二进制文件。

如果使用动态库而不是静态库,可能会有轻微的性能损失(我认为这只会在查找符号时发生)。也许这就是另一位开发者所指的,即静态库比动态库稍微快一些。


我同意这个答案的很多观点,所以不需要再回答了。但是我想补充一点,这取决于你是谁以及项目的目的是什么。如果是自己的东西,你拥有源代码并且不必担心共享,那么静态库有点毫无意义,只会增加额外的工作而没有任何回报。如果你计划向其他人发布,那么它们非常适合保护你的源代码。预编译并准备好使用。 - Bill Burgess
我已经更新了问题以更好地展示其上下文。据我所知,静态库更或多或少是编译器的原始输出,因此在链接阶段,它应该不会有任何区别,无论是链接静态库还是编译器生成的 .o 文件。 - DexM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接