我能想到的唯一优势是编译速度。两种情况下的最终结果(二进制大小和速度)应该是相同的(当然,除非静态库是在没有优化的情况下编译的)。
也将不胜感激一些参考。
更新:当我们不得不在我们的项目中包含小型 3rd 方开源库时出现了这个问题。一位开发人员声明包含预编译的静态库(而不仅仅是复制源文件)将提高应用程序的性能。我看不出为什么会这样。
所以问题是:包含预编译库真的会提高最终应用程序的性能吗?
我能想到的唯一优势是编译速度。两种情况下的最终结果(二进制大小和速度)应该是相同的(当然,除非静态库是在没有优化的情况下编译的)。
也将不胜感激一些参考。
更新:当我们不得不在我们的项目中包含小型 3rd 方开源库时出现了这个问题。一位开发人员声明包含预编译的静态库(而不仅仅是复制源文件)将提高应用程序的性能。我看不出为什么会这样。
所以问题是:包含预编译库真的会提高最终应用程序的性能吗?
如果您谈论的是第三方库,它们的一些优点是:无需发布源代码,(可能)为最终开发人员更简单的安装......虽然有时结果更麻烦,特别是如果它没有正确完成(在没有修复符号的情况下链接其他开源项目,支持错误的架构)。
如果您的意思只是您自己的代码 - 似乎您只是在为自己制造头痛。如果文件没有更改,它们将已经在磁盘上编译(.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 即可获得相同的二进制文件。
如果您使用动态库而不是静态库(我相信只有在查找符号时),性能会受到轻微影响。也许这就是其他开发人员所指的,静态库会比动态库稍微快一些。