【问题标题】:What is the difference between shared and dynamic libraries in C?C中的共享库和动态库有什么区别?
【发布时间】:2019-11-15 21:03:17
【问题描述】:

我不明白这两种库的区别,很多网站都说是同一个东西,但是在学校我们用两个不同的命令来创建它们

动态库

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -ldl

执行:

$ ./main ./libsample.so

共享库

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -L. -lsample

执行:

$ LD_LIBRARY_PATH=. ./main

有人可以帮我理解这两个“代码”之间的区别吗?

【问题讨论】:

  • 您的库是使用完全相同的命令创建的,并且完全相同。区别在于main.c 的两个版本。或许你想看看main.c的代码以便理解。
  • 代码之间的区别在于库的链接方式:第一种情况-ldl建议显式加载库,而第二种情况下,链接信息嵌入程序中
  • 我认为你需要寻找其他两种类型的库之间的区别,静态和共享,这里stackoverflow.com/questions/2649334/…

标签: c shared-libraries dynamic-library


【解决方案1】:

动态 链接库 (.DLL) 是 Microsoft Windows 使用的术语。 共享对象 (.so) 是 Unix 和 Linux 使用的术语。

除此之外,它们在概念上是相同的。

关于你的命令的 sn-ps,我猜区别(我只是在这里猜测,因为你没有向我们展示相关部分)是如何加载库。 “链接时间加载”,其中库通过链接器与可执行文件绑定¹。还有“运行时加载”,程序在其中“摄取”动态/共享库。

运行时加载在 Windows 中使用 LoadLibrary(有一个 …A 和一个 …W 变体)函数完成,在 Unix/Linux 上使用 dlopen(由链接的 libdl 提供)通过那个-ldl库链接声明)。


1:链接器是从各个编译阶段创建的中间对象创建实际可执行文件的程序。

【讨论】:

    【解决方案2】:

    动态库和共享库通常是相同的。但在你的情况下,看起来你正在做一些特别的事情。

    • 共享库 的情况下,您在编译时指定共享库。应用启动时,操作系统会在应用启动前加载共享库。

    • 动态库 的情况下,库在编译时没有指定,因此操作系统不会加载它。相反,您的应用程序将包含一些代码来加载库。

    第一种情况是正常情况。第二种情况是一种特殊用途,如果您的应用程序支持诸如 插件 之类的扩展,则主要相关。动态加载是必需的,因为可以有许多插件,并且它们是在您的应用程序之后构建的。所以他们的名字在编译时不可用。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2011-09-09
      • 1970-01-01
      • 2015-08-18
      相关资源
      最近更新 更多