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

标签 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

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

最佳答案

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

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

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

运行时加载是在 Windows 中通过 LoadLibrary 完成的(有一个 …A 和一个 …W 变体)函数,在 Unix/Linux 上为 dlopen (由 libdl 提供,而 -ldl 库链接语句链接到该库)。

<小时/>

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

关于c - C 中的共享库和动态库有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899488/

相关文章:

c - c 中的 semaphores.h 和 threads.h

c++ - Sleep() 与 _sleep() 函数

linker - CMake:如何生成二进制文件 "as static as possible"

ios - "Do Not Embed"、"Embed & Sign"、"Embed Without Signing"。这些是什么?。他们做什么?

c++ - 结构成员内存布局

c - 使用 C 从文件中读取数据以创建数组

debugging - 如何在尚未加载到 gdb 的共享库中的函数上设置断点

c++ - Callgrind 在动态加载的 SO 中看不到源代码

cmake 项目构建错误,共享库依赖于另一个库

python - 机器人框架库动态导入不保持全局