.o、.a和.so文件之间有什么区别

What is the difference between .o, .a, and .so files?

本文关键字:之间 什么 区别 文件 so      更新时间:2023-10-16

我知道.o是对象文件,.a是静态库,.so是动态库?它们的物理意义是什么?我什么时候可以用,什么时候不能用?

.a是一个"档案";。尽管存档可以包含任何类型的文件,但在GNU工具链的上下文中,它是一个对象文件库(其他工具链,尤其是Windows上的工具链,出于相同的目的使用.lib,但这些文件的格式通常不是通用存档,并且通常是特定于工具链的)。可以从存档中提取单独的对象文件,这基本上是链接器在使用库时所做的。

.o是一个对象文件。这是一种编译为机器代码但(通常)未完全链接的代码——它可能对通过单独编译生成的其他对象文件(在库中或单独)中定义的符号有未解析的引用。对象文件包含元数据以支持与其他模块的链接,也可以选择用于源代码级别的符号调试(例如在GDB中)。其他工具链(通常在Windows上)使用扩展名.obj而不是.o

.so是一个共享对象库(或者只是共享库)。当程序启动时,它会动态链接到可执行文件,而不是在构建时静态链接。它允许更小的可执行文件,并且多个可执行文件可以使用单个对象库实例。操作系统API通常是共享库,出于许可的原因,它们也经常在GNU中使用,例如将LGPL代码与封闭源代码专有代码分离(我不是律师,我不会在任何特定情况下对这种方法的合法性提出任何索赔)。与.o.a文件不同,应用程序使用的.so文件必须在运行时系统上可用。其他系统(通常是Windows)出于同样的目的使用.dll(动态链接库)。

理解.o文件在.a文件中的对象代码之前链接可能是有用的,这样,如果.o文件满足符号分辨率,则任何库实现都不会被链接-允许您用自己的库实现基本上替换库实现,以及库实现调用用户定义的代码——例如,GUI框架可能调用应用程序入口点。

静态库是包含库的目标代码的归档文件,当链接到将代码编译为可执行文件的应用程序中时。

共享库的不同之处在于它们没有编译成可执行文件。相反,动态链接器会搜索一些目录以查找所需的库,然后将其加载到内存中。多个可执行文件可以同时使用同一共享库,从而减少内存使用和可执行文件大小。但是,还有更多的文件要与可执行文件一起分发。您需要确保库安装在用户系统中链接器可以找到它的地方,静态链接消除了这个问题,但会产生更大的可执行文件。

.so是共享库文件。.a是静态库文件。

您可以静态链接到.a库,并在运行时动态链接和加载.so文件,前提是您以这种方式编译和链接。

.o是对象文件(它们是从*.c文件编译而来的,可以链接以创建可执行文件、.a或.so库。点击此处了解更多信息