首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.o文件与.a文件

.o文件与.a文件
EN

Stack Overflow用户
提问于 2009-03-17 15:20:45
回答 6查看 40.2K关注 0票数 69

这两种文件类型的区别是什么。在构建可执行文件的过程中,我看到我的C++应用程序链接了这两种类型。

如何构建.a文件?链接,参考,特别是例子,是高度赞赏的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-17 15:24:03

.o文件是对象。它们是编译器的输出,也是链接器/库的输入。

.a文件是归档文件。它们是一组对象或静态库,也是链接器的输入。

附加内容

我没有注意到你问题中的“例子”部分。通常,您将使用makefile来生成静态库。

代码语言:javascript
复制
AR = ar 
CC = gcc

objects := hello.o world.o

libby.a: $(objects)
    $(AR) rcu $@ $(objects)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

这将把hello.cworld.c编译成对象,然后将它们归档到库中。根据平台的不同,您可能还需要运行一个名为ranlib的实用程序来生成存档中的目录。

一个有趣的附注:从技术上讲,.a文件是归档文件,而不是库。它们类似于未压缩的zip文件,尽管它们使用的是一种更老的文件格式。由ranlib等实用程序生成的目录是归档成为库的原因。Java archive files (.jar)与之类似,因为它们都是压缩文件,具有一些由Java archive have创建的特殊目录结构。

票数 69
EN

Stack Overflow用户

发布于 2009-03-17 15:30:21

.o文件是编译单个编译单元(本质上是源代码文件,以及相关的头文件)的结果,而.a文件是打包为库的一个或多个.o文件。

票数 23
EN

Stack Overflow用户

发布于 2009-03-17 17:13:40

D Shawley的答案很好,我只想补充几点,因为其他答案反映了对正在发生的事情的不完全理解。

请记住,存档文件(.a)并不限于包含对象文件(.o)。它们可能包含任意文件。通常不是很有用,但请参阅dynamic linker dependenciy info embedded in an archive了解一个愚蠢的链接器技巧。

还要注意,目标文件(.o)不一定是单个编译单元的结果。可以将几个较小的目标文件部分链接到一个较大的文件中。

http://www.mihaiu.name/2002/library_development_linux/ --在此页面中搜索"partial“

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/654713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档