一尘不染

为什么要从.o创建.a文件进行静态链接?

linux

考虑以下代码:

one.c:

#include <stdio.h>

int one() {
   printf("one!\n");
   return 1;
}

two.c:

#include <stdio.h>

int two() {
   printf("two!\n");
   return 2;
}

程序

#include <stdio.h>

int one();
int two();

int main(int argc, char *argv[]) 
{
   one();
   two();

   return 0;
}

我想将这些程序链接在一起。所以我这样做:

gcc -c -o one.o one.c
gcc -c -o two.o two.c
gcc -o a.out prog.c one.o two.o

这样很好。

或者我可以创建一个静态库:

ar rcs libone.a one.o
ar rcs libtwo.a two.o
gcc prog.c libone.a libtwo.a
gcc -L. prog.c -lone -ltwo

所以我的问题是:为什么我要使用第二个版本(即创建“ .a”文件的版本)而不是链接“ .o”文件?它们似乎都是静态链接,所以彼此之间是否有优势或架构上的差异?


阅读 472

收藏
2020-06-07

共1个答案

一尘不染

通常,库是可以在多个程序中使用的目标文件的集合。

在您的示例中没有优势,但是您可能已经做到了:

ar rcs liboneandtwo.a one.o two.o

然后,链接程序变得更加简单:

gcc -L. prog.c -loneandtwo

这实际上是包装问题。您是否有一组对象文件,它们自然地形成了一组相关功能,可以在多个程序中重用?如果是这样,则可以将它们明智地存档到静态库中,否则可能没有任何优势。

最后一个链接步骤有一个重要区别。您链接的任何目标文件都将包含在最终程序中。库中的目标文件仅在它们有助于解析其他目标文件中任何未定义符号的情况下才包括在内。如果没有,它们将不会链接到最终的可执行文件中。

2020-06-07