C中的共享库和动态库有什么区别?

时间:2019-07-05 08:36:37

标签: c shared-libraries dynamic-library

我不了解两种类型的库之间的区别,许多网站都说它们是同一件事,但是在学校,我们使用两种不同的命令来创建它们

动态库

$ 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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

运行时加载是在Windows中使用LoadLibrary(有…A…W变体)功能完成的,而在Unix / Linux上是通过dlopen完成的由libdl库链接语句链接到的-ldl提供。


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

答案 1 :(得分:0)

动态库和共享库通常是相同的。但就您而言,似乎您正在做一些特别的事情。

  • 共享库情况下,您在编译时指定共享库。启动应用程序后,操作系统将在应用程序启动之前加载共享库。

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

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

相关问题