静态库
- 静态库在编译时被链接到目标程序中,成为目标程序的一部分。
- 静态库的函数和数据被复制到目标程序中,使得目标程序可以独立运行,不依赖于外部库文件。
- 静态库的文件较大,因为它包含了所有需要的函数和数据。
- 静态库在目标程序编译时被静态链接器处理,链接时会将库文件的代码和数据复制到目标程序中。
- 静态库的扩展名在 Linux 上通常是
.a
(例如libexample.a
),在 Windows 上通常是.lib
(例如example.lib
)。
动态库
- 动态库在运行时被加载到内存中,并由操作系统提供动态链接的支持。
- 动态库的函数和数据不会被复制到目标程序中,目标程序只包含对动态库的引用。
- 动态库的文件较小,因为它只包含函数和数据的引用,实际的代码和数据存储在库文件本身中。
- 动态库在目标程序运行时由动态链接器加载和解析,使得多个程序可以共享同一个动态库的实例。
- 动态库的扩展名在 Linux 上通常是
.so
(例如libexample.so
),在 Windows 上通常是.dll
(例如example.dll
)。
需要注意的是,扩展名只是一种约定,并非强制要求。实际上,你可以使用其他扩展名来命名库文件,但通常为了遵循惯例和方便识别,推荐使用上述的扩展名。
关于 .o 文件
.o
文件是目标文件(Object File),它是编译源代码后生成的中间文件,包含了编译后的二进制代码和符号信息。.o
文件本身既不是静态库也不是动态库。