什么是.a和.so文件?

556

我目前正在尝试将一个C应用程序移植到AIX,但有些困惑。.a和.so文件是什么,以及在构建/运行应用程序时如何使用它们?


165
一个是库文件归档(library archive),另一个是共享对象(shared object)。 - Shiplu Mokaddim
可能是重复的问题,参考 *.so、.la 和 .a 库文件有什么区别?*。 - Peter Mortensen
5个回答

624

存档库(.a)是静态链接的,也就是在使用gcc时以-c选项编译程序。因此,如果库中有任何更改,您需要重新编译和构建代码。

.so(shared object)库比.a库的优势在于它们在运行时链接,也就是在通过gcc的-o选项创建.o文件之后。因此,如果.so文件有任何更改,您不需要重新编译主程序。 但请确保您的主程序已经用ln命令链接到新的.so文件。

这将帮助您构建.so文件。 http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html


3
这些内容中是否有与“PIC”(位置无关代码)相关的? - transang

279

.a是静态链接库,如果你使用其中存储的代码,它将被提取并嵌入到你自己的二进制文件中。在Visual Studio中,这些文件通常是以.lib为后缀的。

.so是动态链接库,如果你使用其中存储的代码,不会被提取和嵌入到你自己的二进制文件中。相反,它只是被引用,因此二进制文件将依赖于它们,并在运行时添加/加载来自.so文件的代码。在Visual Studio / Windows中,这些文件通常是以.dll为后缀的(还包括小型的.lib文件,其中包含链接信息)。


1
你好,有没有在C/C++代码中反编译.so文件的选项? - Jishant
1
@Ancee:看看这个问题:https://dev59.com/iXVC5IYBdhLWcg3wtzkQ - Paul Wintz
3
一个用于.dll的小型.lib文件被称为导入库。 - Second Person Shooter
“而只是被引用”,这是如何工作的 - 动态库中的代码不必加载到托管进程中吗? - Joel Blum
@JoelBlun 是的,但只能在运行时而非编译时。 - Mario

13

.a文件通常是被静态链接(或更准确地说是存档)的库,而.so是动态链接库。

要进行端口转移,您需要获取编译它们的源代码或在您的AIX机器上找到等效的文件。


如何构建我的应用程序以使用.so文件? - Dunc
在网上有许多关于构建这两种类型的库以及链接它们的优秀参考资料。谷歌是你的好朋友。 - David Pointer
1
@Dunc - 有几种方法。你有一个makefile吗?通常,汇编整个程序的命令(因此调用链接器)将使用-L/dir/dir1/.../指定查找库文件的位置,并且还可以使用-lname显式命名库。您会发现实际名称为libname.a或libname.so。如果这是一个相当正常的程序,链接器就可以弄清楚该怎么做。但是您仍然需要解决制作或查找.so文件的问题。您是否有构建它的源代码或AIX库? - gbulmer

11

它们被用于链接阶段。.a文件是静态链接的,而.so文件则是半静态链接的,这意味着当你运行exe时需要库。

您可以通过查看任何lib目录找到它们的存储位置.../usr/lib/lib大部分都有,还有LIBRARY_PATH环境变量。


3

维基百科是了解此信息的好来源。

要了解像.a这样的静态库文件,请阅读静态库

要了解像.so这样的共享库文件,请阅读计算机库#共享库 在此页面上,还有关于文件命名部分的有用信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接