当前位置:  开发笔记 > 编程语言 > 正文

.o文件与.a文件

如何解决《.o文件与.a文件》经验,为你挑选了4个好方法。

这两种文件类型有什么区别.我看到我的C++应用程序在构造可执行文件时链接了两种类型.

如何构建.a文件?链接,参考,尤其是示例,非常感谢.



1> D.Shawley..:

.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.cworld.c转换为对象,然后将它们存档到库中.根据平台的不同,您可能还需要运行一个名为的实用程序ranlib来生成存档上的目录.

一个有趣的旁注:.a文件在技术上是归档文件而不是库.它们类似于没有压缩的zip文件,尽管它们使用的是更旧的文件格式.由实用程序生成的目录ranlib是使归档成为库的原因.Java归档文件(.jar)的类似之处在于它们是具有Java归档程序创建的一些特殊目录结构的zip文件.


@ShammelLee - 我通常避免使用`$ ^`,因为它是GNU Make扩展而不存在于[BSD make](https://www.freebsd.org/cgi/man.cgi?make(1))或者[POSIX make](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html).我并不重要,因为大多数Linux发行版都是基于GNU的,但是从bash到dash的`/ bin/sh`的切换足以让我继续避免GNU特定的扩展.

2> Vatine..:

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



3> bstpierre..:

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

请记住,存档文件(.a)不限于包含目标文件(.o).它们可能包含任意文件.通常不常用,但请参阅存档中嵌入的动态链接器依赖信息,以获取愚蠢的链接器技巧.

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

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



4> qrdl..:

您可以使用从文件(目标文件)ar创建.a文件(静态库.o)

详情man ar请见.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有