当前位置: 首页 > 面试题库 >

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

宫铭
2023-03-14
问题内容

考虑以下代码:

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”文件?它们似乎都是静态链接,所以彼此之间是否有优势或架构上的差异?


问题答案:

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

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

ar rcs liboneandtwo.a one.o two.o

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

gcc -L. prog.c -loneandtwo

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

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



 类似资料:
  • 使用clang链接AFN .a静态库 AFN静态库的生成不是重点, 以链接使用为主 一、准备 在staticLib文件夹下新建test.m文件, 代码如下 #import <Foundation/Foundation.h> #import <AFNetworking.h> int main() { AFHTTPSessionManager *manager = [AFHTTPSe

  • 每一个国家的都有其特殊国情,主要是原因是中国的网络太慢,及中国存在大量老旧的计算机,它们预装着window XP,IE浏览器最高只能升级到IE8, 出于这两方面的原因,我们需要一个体积更少,兼容性更好的React。并且之前facebook也闹过LICENSE问题,更是促进中国互联网公司决定自主研发框架,努力摆脱对外国框架的依赖。 对于我们公司而言,一个旅游公司, 在线上订火车票,飞机票, 景点门票

  • 大多数在线来源都表明您可以静态链接glibc,但不鼓励这样做;例如centos包repo: glibc静态包包含用于静态链接的C库静态库。你不需要这些,除非你静态链接,这是非常不鼓励的。 这些消息来源很少(或从未)说明为什么这是个坏主意。

  • 我已经编写了以下代码,并为这个超类创建了对象。 当我检查输出时,如下所示: 我知道只有在初始化类的对象或进行任何静态引用时,才会执行静态块。但在这里,我并没有把这些都带到课堂上。那么为什么我会看到“sub”即sub类的静态块输出?

  • 问题内容: main.go 目录结构: 即使阅读了文档,我仍然无法理解此处的确切功能。 1)如果删除,为什么我无法访问? 2)如果删除该功能,URL将映射到文件夹吗? 问题答案: 将请求的处理转发给您指定为其参数的对象,但在此之前,它会通过剥离指定的前缀来修改请求URL。 因此,例如,在您的情况下,如果浏览器(或HTTP客户端)请求资源: 将会剪切和将修改后的请求转发到由返回的处理程序,因此它将看

  • 问题内容: 这是指帖子 ..无法回复或评论任何这样创建的新帖子。为什么是我的 发出警告-应该以静态方式访问静态字段MyUnits.MILLSECONDS吗?谢谢。 问题答案: 因为当您访问静态字段时,您应该在类(或本例中为枚举)上执行此操作。如 不在实例中 编辑 要解决 为什么这样 的问题:在Java中,当您将声明为时,就是说它是类的成员,而不是对象(因此为什么只有一个)。因此,在对象上访问它是没