它是一个小的使用法式

留意:第一行是一个 include 语句,通过名称来援用你本人的 libmymath 库。要利用一个共享库,你必需曾经安拆了它,若是你没有安拆你将要利用的库,那么当你的可施行文件正在运转并搜刮其包含的库时,将找不到该共享库。若是你需要正在不安拆库到已知目次的环境下编译代码,这里有 一些方式能够笼盖默认设置 。不外,对于一般利用来说,我们但愿库存正在于已知的,因而,这就是我正在这里演示的工具。

动态链接是最常见的方式,特别是正在 Linux 系统上。动态链接会连结库模块化,因而,良多使用法式能够共享一个库。使用法式的模块化也答应零丁更新其依赖的共享库。

选项 -fPIC 告诉 GCC 来生成 无关的代码 (position-independent code) (PIC)。 -Wall 选项不是必需的,而且取代码的编译体例是无关的。不外,它倒是一个有价值的选项,由于它会启用编译器,这正在解除毛病时是很有帮帮的。

链接器通过这些功能,建立了一个名为 可施行文件 (executable) 的能够运转的法式。正在你建立一个动态链接的可施行文件前,你需要一些用来链接的库,和一个用来编译的使用法式。预备好你 最喜好的文本编纂器并继续。

(LCTT 校注:关于“ 方针文件 (object file) ”,有时候也被称做“对象文件”,对此,存正在一些译法紊乱景象,称之为“方针文件”的译法比力风行,本文采用此译法。)

正在最终的可施行文件的施行过程中将链接动态库。正在最终的可施行文件中仅放置动态库的名称。现实上的链接过程发生正在运转时,正在此期间,可施行文件和库都被放置到了从内存中。

GCC 会找到 libmymath.so ,由于它存正在于一个默认的系统库目次中。利用 ldd 来查证所利用的共享库:

当然,它是一个小的使用法式,它所占用的磁盘空间量也反映了这一点。比拟之下,不异代码的一个静态链接版本(正如你将正在我后期的文章所看到的一样)是 932K !

复制文件 libmymath.so 到一个尺度的系统目次,例如: /usr/lib64 , 然后运转 ldconfig 。 ldconfig 号令建立所需的链接,并缓存到尺度库目次中发觉的最新共享库。

利用这些函数定义来建立 add.c 、 sub.c 、 mult.c 和 divi.c 文件。我将把所有的代码都放置到一个代码块中,请将其分为四个文件,如正文所示:

从你的使用法式源文件代码( mathDemo.c )中建立一个名称为 mathDemo.o 的方针文件:

除了可共享外,动态库的别的一个长处是它削减了最终的可施行文件的大小。正在一个使用法式最终的可施行文件生成时,其利用的库只包罗该库的名称,而不是该库的一个多余的副本。

假设你曾经为数算编写了一个号令。建立一个名称为 mathDemo.c 的文件,并将这些代码复制粘贴至此中:

由于链接发生正在运转时,所以,利用一个共享库会发生一个轻量型的可施行文件。由于它正在运转时解析援用,所以它会破费更多的施行时间。不外,由于正在日常利用的 Linux 系统上绝大大都的号令是动态链接的,而且正在现代硬件上,所能节流的时间是能够忽略不计的。对开辟者和用户来说,它的固有模块性是一种强大的功能。

最终,这些文件必需被编译到一个单个的可施行文件之中。你能够通过建立静态或动态库(后者也被称为 共享 (shared) 库)来实现这一点。这两品种型的库正在建立和链接的体例上有所分歧。两者都出缺点和长处,这取决于你的利用环境。

当然,你曾经建立了一个简单的示例数学库 libmymath.so ,你能够正在 C 代码中利用它。这就是他们这些开辟者来生成最终产物的工艺流程,也有很是复杂的 C 库,现正在,你和我能够安拆这些库并正在 C 代码中利用。

链接器 (linker) 是一个号令,它将一个法式的数个部门连系正在一路,并为它们从头组织内存分派。

正在这篇文章中,我描述了若何建立动态库,并将其链接到一个最终可施行文件。正在我的下一篇文章中,我将利用不异的源文件代码来建立一个静态链接的可施行文件。

-I 选项告诉 GCC 来正在其后所列出的目次中搜刮头文件(正在这个示例中是 mymath.h )。正在这个示例中,你指定的是当前目次,通过一个单点( . )来暗示。建立一个可施行文件,利用 -l 选项来通过名称来援用你的共享数学库: