.o文件与.a文件

这两种文件types有什么区别? 我看到我的C ++应用程序在构build可执行文件时与两种types链接。

如何build立.a文件? 链接,参考文献,特别是例子,高度赞赏。

.o文件是对象。 它们是编译器的输出和input到链接器/库pipe理器。

.a文件是档案。 它们是对象或静态库的组合,也被input到链接器中。

其他内容

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

 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文件在技术上是归档文件而不是库。 它们类似于压缩文件而不压缩,尽pipe它们使用了更老的文件格式。 由像ranlib这样的工具生成的目录就是将一个档案变成一个 。 Java归档文件( .jar )是类似的,它们是由Java归档程序创build的具有特殊目录结构的zip文件。

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

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

请记住,存档文件(.a)不限于包含目标文件(.o)。 它们可能包含任意文件。 通常不会有用,但请参阅embedded在存档中的dynamic链接器依赖信息,以获得愚蠢的链接器技巧。

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

http://www.mihaiu.name/2002/library_development_linux/ – 在此页面search“部分”

您可以使用ar.o文件(对象文件)创build.a文件(静态库)

详情请看man ar

我相信.a文件是一个可以包含多个对象文件的存档。