这两种文件类型的区别是什么。在构建可执行文件的过程中,我看到我的C++应用程序链接了这两种类型。
如何构建.a文件?链接,参考,特别是例子,是高度赞赏的。
发布于 2009-03-17 15:24:03
.o文件是对象。它们是编译器的输出,也是链接器/库的输入。
.a文件是归档文件。它们是一组对象或静态库,也是链接器的输入。
附加内容
我没有注意到你问题中的“例子”部分。通常,您将使用makefile来生成静态库。
AR = ar
CC = gcc
objects := hello.o world.o
libby.a: $(objects)
$(AR) rcu $@ $(objects)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@这将把hello.c和world.c编译成对象,然后将它们归档到库中。根据平台的不同,您可能还需要运行一个名为ranlib的实用程序来生成存档中的目录。
一个有趣的附注:从技术上讲,.a文件是归档文件,而不是库。它们类似于未压缩的zip文件,尽管它们使用的是一种更老的文件格式。由ranlib等实用程序生成的目录是归档成为库的原因。Java archive files (.jar)与之类似,因为它们都是压缩文件,具有一些由Java archive have创建的特殊目录结构。
发布于 2009-03-17 15:30:21
.o文件是编译单个编译单元(本质上是源代码文件,以及相关的头文件)的结果,而.a文件是打包为库的一个或多个.o文件。
发布于 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“
https://stackoverflow.com/questions/654713
复制相似问题