什么是 .a 和 .so 文件?

Posted

技术标签:

【中文标题】什么是 .a 和 .so 文件?【英文标题】:What are .a and .so files? 【发布时间】:2012-04-06 05:49:54 【问题描述】:

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

【问题讨论】:

一个是库archive,另一个是shared object What's the difference between .so, .la and .a library files? 的可能副本。 【参考方案1】:

归档库 (.a) 是静态链接的,即当您在 gcc 中使用 -c 选项编译程序时。所以,如果库有任何变化,你需要重新编译和构建你的代码。

.so(共享对象)优于 .a 库的优点是它们在运行时链接,即在 gcc 中创建 .o 文件 -o 选项之后。所以,如果 .so 文件有任何变化,你不需要重新编译你的主程序。 但请确保您的主程序使用 ln 命令链接到新的 .so 文件。

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

【讨论】:

这些是否与pic(位置无关代码)有关?【参考方案2】:

***是该信息的不错来源。

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

要了解共享库文件,如 .so,请阅读 Library_(computing)#Shared_libraries 在此页面上,文件命名部分也有有用的信息。

【讨论】:

【参考方案3】:

它们用于链接阶段。 .a 文件是静态链接的,.so 文件是某种链接的,因此无论何时运行 exe 都需要该库。

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

【讨论】:

【参考方案4】:

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

要进行移植,您将需要编译它们的源代码,或 AIX 机器上的等效文件。

【讨论】:

如何构建我的应用程序以使用 .so 文件? 有很多优秀的参考资料可用于构建这两种类型的库并在 Web 上链接到它们。 Google 是您的朋友。 @Dunc - 有几种方法。你有makefile吗?通常汇编整个程序(并因此调用链接器)的命令将使用 -L/dir/dir1/.../ 指定查找库文件的位置,也可以使用 -lname 显式命名库。您会发现实际名称是 libname.a 或 libname.so。然后,如果这是一个相当正常的程序,链接器可以弄清楚该怎么做。但是您仍然有制作或查找 .so 文件的问题。您是否有构建它的源代码或 AIX 库?【参考方案5】:

.a 是静态库。如果您使用存储在其中的代码,它会从它们中获取并嵌入到您自己的二进制文件中。在 Visual Studio 中,这些是 .lib 文件。

.so 是动态库。如果您使用存储在其中的代码,则不会将其嵌入到您自己的二进制文件中。相反,它只是被引用,因此二进制文件将依赖于它们,并且来自 so 文件的代码在运行时添加/加载。在 Visual Studio/Windows 中,这些是 .dll 文件(带有包含链接信息的小 .lib 文件)。

【讨论】:

您好,是否有任何选项可以在 c/c++ 代码中反编译 .so 文件? @Ancee:看看这个问题:***.com/questions/205059/is-there-a-c-decompiler .dll 的一个小的 .lib 文件称为导入库。 "。相反,它只是被引用",这是如何工作的——动态库中的代码不是必须加载到托管进程中吗? @JoelBlun 是的,但仅在运行时,而不是在编译时。

以上是关于什么是 .a 和 .so 文件?的主要内容,如果未能解决你的问题,请参考以下文章

linux .o,.a,.so文件区别是什么

linux下的so,o,lo,a,la文件有啥区别

什么是 .so.2 文件?

请问我有一个.so文件,如何在Linux下编程使用呢?

android so文件是啥

Linux系统下.ko文件是啥文件?.so文件是啥文件?