.a 和 .so 文件有什么区别?

Eri*_*k B 79 libraries

据我了解它们是图书馆,但两者之间有什么区别?

ajk*_*ajk 62

甲.a文件是一个静态库,而一个.so文件是一个共享对象的(动态)库类似于Windows上的DLL。此页面上有一些有关两者之间差异的详细信息。

  • `.a` 只能在编译期间作为程序的一部分包含在内。`.so` 可以在程序加载时“导入”。 (25认同)
  • @hfrmobile a 代表 *archive* - 静态库是使用 `ar` 实用程序创建的对象文件的集合。[更多信息](http://www.tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html) (5认同)
  • .a 代表什么? (3认同)

Hac*_*Saw 33

作为后续,.a 文件是一个“ar”存档。与 tar 存档不同,它存储 .o 或目标文件,允许将它们从存档中拉出,并链接到程序中等等。如果需要,您可以使用 ar 来存储其他文件。

您可以使用 -t 参数获取 ar 文件的成员列表,例如:

ar -t /usr/lib/libc.a
Run Code Online (Sandbox Code Playgroud)

.so 文件是一个“共享对象”文件,链接器可以使用更多信息,以便成员可以尽快链接到加载程序。

例如,尝试:

objdump -T /lib/libc-2.11.1.so
Run Code Online (Sandbox Code Playgroud)

(或您的 /lib 目录中的任何 libc.so 版本。)请注意,.so 文件也可以只包含一个链接描述文件,指示它在别处查找文件,或使用其他文件。

有趣的是,.so 文件也可以是一个完整的程序。例如,尝试运行/lib/libc.so.6。(遗憾的是,最后一部分似乎不适用于更现代的系统。并不是说这是一个很大的损失。)

  • 您还可以在 .so 上运行 `ldd`,它会显示它使用的其他库。静态将返回一条消息,说明它不是动态库。 (2认同)