Linker 对于单个文件程序,a.o、.a、.so和可执行文件是否等效?

Linker 对于单个文件程序,a.o、.a、.so和可执行文件是否等效?,linker,.so,.a,Linker,.so,.a,据我所知,.o文件是将源文件转换为机器代码时的输出,同时还有一系列“符号”,用于命名函数和变量等 文件是一个静态库,基本上是打包到一个文件中的(未链接的?)对象文件的存档 一个.so文件是一个共享库,它是Windows中的一个DLL,它指定了您要使用的源,但是.o文件本身被保存在计算机外部,直到您实际运行该程序为止 可执行文件是链接一组对象文件以定义所有符号的结果,是一个可运行的文件 我的问题:如果您编写的程序中所有函数和变量都是在一个源文件中定义和使用的,因此不需要对.o输出进行外部链接,那么

据我所知,.o文件是将源文件转换为机器代码时的输出,同时还有一系列“符号”,用于命名函数和变量等

文件是一个静态库,基本上是打包到一个文件中的(未链接的?)对象文件的存档

一个.so文件是一个共享库,它是Windows中的一个DLL,它指定了您要使用的源,但是.o文件本身被保存在计算机外部,直到您实际运行该程序为止

可执行文件是链接一组对象文件以定义所有符号的结果,是一个可运行的文件

我的问题:如果您编写的程序中所有函数和变量都是在一个源文件中定义和使用的,因此不需要对.o输出进行外部链接,那么这些文件之间的区别是什么?这包括任何格式、大小或性能差异


我可以直接运行a.o或.a或.o吗?如果我这样做了,那会比运行可执行文件快还是慢?

那么到标准库的隐式链接呢?.a和.o文件还不是可执行代码。链接器使用它们来生成最终的可执行映像。我想只是假设程序中没有“包含”。因此,除了可以正常编写的任何东西,例如“+”或“return”可能是执行任何操作所必需的。@HansPassant在.a或.o中解析所有符号时也是这样吗?当我查找“链接器”时,有人告诉我,关键是要解析对象文件中任何未定义的符号,但是如果所有内容都在一个文件中定义,那么所有符号都应该在编译后解析,那么链接器还做什么呢?这是我问题的主旨。呃,情况总是这样。如果链接器无法解析符号,则无法生成可执行图像。拥有一个源文件的可能性更大,但您仍然需要链接CRT,可能还需要链接库的.a文件。那么隐式链接到标准库呢?.a和.o文件还不是可执行代码。链接器使用它们来生成最终的可执行映像。我想只是假设程序中没有“包含”。因此,除了可以正常编写的任何东西,例如“+”或“return”可能是执行任何操作所必需的。@HansPassant在.a或.o中解析所有符号时也是这样吗?当我查找“链接器”时,有人告诉我,关键是要解析对象文件中任何未定义的符号,但是如果所有内容都在一个文件中定义,那么所有符号都应该在编译后解析,那么链接器还做什么呢?这是我问题的主旨。呃,情况总是这样。如果链接器无法解析符号,则无法生成可执行图像。拥有一个源文件的可能性会更大,但您仍然需要链接CRT和库的.a文件。