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

luc*_*ent 6 c shared-libraries dynamic-library

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

动态库

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -ldl
Run Code Online (Sandbox Code Playgroud)

执行:

$ ./main ./libsample.so
Run Code Online (Sandbox Code Playgroud)

共享库

$ gcc -shared -o libsample.so lib.c
$ gcc -o main main.c -L. -lsample
Run Code Online (Sandbox Code Playgroud)

执行:

$ LD_LIBRARY_PATH=. ./main
Run Code Online (Sandbox Code Playgroud)

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

dat*_*olf 12

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

\n\n

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

\n\n

关于您的命令片段,我猜差异(我只是在这里猜测,因为您没有向我们展示相关部分)是如何加载库的。有“链接时加载”,其中库通过链接器\xc2\xb9 绑定到可执行文件。还有“运行时加载”,程序在其中“摄取”动态/共享库。

\n\n

运行时加载在 Windows 中使用LoadLibrary(有一个\xe2\x80\xa6A和一个\xe2\x80\xa6W变体)函数完成,在 Unix/Linux 上使用dlopen(通过该库链接语句libdl链接到该函数来实现-ldl)。

\n\n
\n\n

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

\n


Cod*_*odo 5

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

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

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

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