为什么选择静态库和动态库?

C语言中的是捆绑在一起以供其他程序使用的一组函数和声明。 在库中,库的应用程序编程接口(API)在许多头文件(.h).

API (应用程序编程接口)是一个术语,表示库中的函数/方法,您可以调用该函数/方法要求它为您做事-库的接口。

标头中列出的程序的实现以预编译为目标文件(.o) ac源文件表示。 标准库通常存储在/ lib或/ usr / lib目录中。 但是应该注意,库有两个版本:静态和动态。 这两种类型有不同的命名方案。 一个常见的命名规则是每个库必须在名称后附加lib前缀。 文件后缀取决于它是哪种类型的库。 对于静态库,文件后缀为.a而动态库后缀为.so

有关静态库的更多信息,请转到我以前的帖子。

什么是动态库?

动态库的工作原理与静态库不同,它是在运行时加载到内存中的,而不是插入到实际程序中的。 这使动态库更易于在程序之间共享,并节省了空间,因为该库只需要加载一次。

如何创建动态库

要在linux中创建一个库,您需要将所有c文件预编译为目标文件。 这是通过带有c标志的gcc命令完成的。 fPIC标志使库与位置无关,并防止库由不同进程共享。

  gcc -c -fPIC * .c 

要制作实际的库,您需要使用共享标志对目标文件进行gcc。 不要忘记添加lib前缀并以.so后缀结尾。

  gcc -share -o liblibrary.so * .o 

要检查库文件中包含哪些功能,请使用nm功能。 D标志显示初始化数据部分中的内容。

  nm -D liblibrary.so 

如何使用动态库

现在,您已经编译了动态库,您将必须使用export或在标准库文件夹(例如〜/ lib,/ usr / local / lib,/ usr / lib)中将文件的位置添加到环境中。 要导出到环境,请使用:

 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH 

这将使用当前工作目录(。)导出变量LD_LIBRARY_PATH,并保留先前的LD_LIBRARY_PATH。

现在,您已经设置了要使用的动态库,您可以使用gcc编译对库中程序的所有c文件引用。 L标志用于指定要搜索库的目录。 l标志需要带lib前缀和.so后缀的库文件名才能正常工作。

  gcc -Wall-pedantic -Werror -Wextra -L。  main.c -l库 

使用动态库与静态库的好处

一个明显的好处是与静态库相比,减少了空间使用。 静态库始终会复制到可执行文件中,因此最终结果将始终包含头文件中的所有功能,无论是否使用它。 动态库的另一个好处是程序之间的可移植性。 由于可以在运行时调用动态库,因此可以在不同程序之间使用同一动态库,并且可以在不需要时从内存中将其卸载。 动态库的增加的模块化也意味着该库可以从程序的其余部分独立升级。