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

12

我了解到.so是动态库文件,而.a是静态库文件。

在构建openssl时,我使用了选项./Configure no-shared,它创建了很多.a文件。

那么,我的问题是其他软件包(如apache)是否能够使用来自openssl的.a文件?

举个例子:libcrypto.a,

请问是否有人能指导我,我是否完全走错了路。


3个回答

11
基本上,静态库可以在链接时编译到另一个应用程序中。在您的示例中,Apache 可以在构建时使用 libcrypto.a 并将其包含在 Apache httpd 应用程序中。
动态 .so 库可以在运行时加载和卸载,并且您具有更好的灵活性来更改 Apache 应支持什么而无需重新编译 Apache 二进制文件。
以 Apache 为例,动态加载 .so 文件的使用方法在文档中的Dynamic Shared Object (DSO)部分中有描述。您还可以找到链接到安装部分的链接,其中描述了如何在构建时包含静态库。
这方面有一个很好的问题,值得一读,并提供了更多主题细节。 共享对象 (.so)、静态库 (.a) 和 DLL (.so) 之间的区别是什么?

感谢您的努力。因此,如果在构建时静态链接libcrypto.a并将其包含在httpd应用程序中。那么像mod_ssl这样的httpd应用程序模块是创建为静态库还是动态库?如果是动态库,则必须在httpd.conf文件中使用LoadModule。在静态情况下,它会在httpd启动时自动加载,对吧? - Droider
如果它是静态的,您需要在httpd应用程序编译期间添加它,无法像动态库一样在启动时动态加载。我已经多年没有使用Solaris了,但如果您可以考虑动态运行mod_ssl,则可能会有所帮助。http://stackoverflow.com/questions/11548943/compile-apache-2-4-2-in-solaris-10-in-a-x86-machine-64bits-errors或者这个http://docs.oracle.com/cd/E19830-01/819-4712/ablws/ - Qben

1
如果A.a是静态库,两个不同的程序想要使用它。对于每个程序,A.a会被创建两次。而如果A.so是动态库,则两个程序访问同一个文件。这意味着你在库中使用了引用。
如果你的库将在多个可执行文件(如apache和openssl)之间共享,通常将其设置为动态库可以减少可执行文件的大小。否则,一定要将其设置为静态库。
在你的情况下,你必须创建动态库。

感谢您的回答。问题在于我无法构建具有共享库的 FIPS 能力 openssl。 当使用 configure no-shared 构建 openssl 时,一切都很顺利。 因此,我考虑使用静态 openssl 库编译 httpd,并在这里得到了结果!! - Droider
顺便提一下,我在Solaris 10平台上使用SPARC架构的openss-1.0.1e httpd-2.4.6 openssl-fips-2.0.5。如果能帮忙在上述平台上构建具备共享库支持的FIPS能力openssl,将不胜感激。 - Droider

0

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