.o、.a和.so文件之间有什么区别
What is the difference between .o, .a, and .so files?
我知道.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库。点击此处了解更多信息
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 这 4 个 lambda 表达式之间有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 不同的类或结构初始化方法之间的性能差异是什么?
- "constinit"和"constexpr"之间的真正区别是什么?
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 移动语义和深层/浅层复制之间有什么关系?
- 这两种C++语法之间有什么区别?
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- ((int) a) 和 (int(a)) 之间的区别是什么?
- ( var > x) 和 ( x < var)之间有什么区别吗?
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 超市管理系统的类别之间应该是什么关系?
- 指针和程序性能之间有什么关系吗?
- 这些初始化之间有什么区别?
- 空字符和"\0"之间有什么区别?
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?