【问题标题】:Difference between .so file and .a file?.so 文件和 .a 文件之间的区别?
【发布时间】:2013-11-07 02:59:32
【问题描述】:

我读到.so 是动态库文件,.a 是静态库文件。

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

所以,我的问题是,像 apache 之类的其他软件包能否使用来自 openssl 的 .a 文件?

例如libcrypto.a

如果我走错了路,请有人给我建议。

【问题讨论】:

标签: linux apache dynamic static openssl


【解决方案1】:

基本上静态库可以在链接时编译另一个应用程序。在您的示例中,Apache 可以在构建期间使用 libcrypto.a 并将其包含在 Apache httpd 应用程序中。

动态.so 库可以在运行时 加载和卸载,您可以更灵活地更改Apache 应支持的内容,而无需重新编译Apache 二进制文件。

以 Apache 为例,.so 文件的动态加载在文档的Dynamic Shared Object (DSO) 部分中进行了描述。您还可以找到安装部分的链接,该部分描述了如何在构建时包含静态库。

有一个很好的问题可以很好地阅读,并且提供了主题中的细节。

Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?

【讨论】:

  • 感谢您的努力。因此,如果 libcrypto.a 在构建期间静态链接并包含在 httpd 应用程序中。像 mod_ssl 这样的 httpd 应用程序模块是否将创建为静态库或动态库?如果它是动态的,我必须在 httpd.conf 文件中使用 LoadModule。如果是静态的,它会在 httpd 正确启动时自动加载?
  • 如果是静态的,需要在编译httpd应用时添加,不能像动态库那样在启动时动态加载。我已经多年没有使用 Solaris,但如果您可以考虑动态运行 mod_ssl,这可能会有所帮助。 stackoverflow.com/questions/11548943/… 或这个docs.oracle.com/cd/E19830-01/819-4712/ablws
【解决方案2】:

如果 A.a 是静态库并且两个不同的程序想要使用它。 A.a 为每个程序创建两次。而如果 A.so 是动态库,则两个程序访问同一个文件。 这意味着您在库中使用参考。

如果您的库要在多个可执行文件(如 apache 和 openssl)之间共享,通常将其动态化以减小可执行文件的大小是有意义的。否则,请务必将其设为静态。

在您的情况下,您必须创建动态库

【讨论】:

  • 感谢您的回答。问题是我无法使用共享库构建支持 FIPS 的 openssl。在使用 configure no-shared 构建 openssl 时,它运行良好。所以,我想到了针对静态 openssl 库编译 httpd,结果在这里!!
  • 顺便说一下,我在具有 SPARC 架构的 Solaris 10 平台上使用 openss-1.0.1e httpd-2.4.6 openssl-fips-2.0.5。在上述平台上构建具有共享库支持的支持 FIPS 的 openssl 的任何帮助都会有所帮助。
【解决方案3】:

请阅读 - http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html.

这是一个非常好的示例教程。

你会学到 -

  1. 什么是静态库 (.a) 以及如何制作它。
  2. 什么是共享库 (.so) 以及如何制作它。
  3. 与.ddl(windows os)的区别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2015-07-23
    • 2011-08-19
    • 2012-08-27
    • 2012-07-05
    • 2015-04-06
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多