C语言中静态库与动态库的区别

库是编程的重要组成部分,没有它,我们将不得不重复编写类似的函数。 但是静态库和动态库之间有区别。

静态链接会将程序中使用的所有代码从库模块复制到编译程序中。 实际的链接是由称为链接器的程序执行的,这是编译程序的最后一步。

在动态链接中,共享库的名称放置在可执行文件中,而实际链接在运行时发生。

使用动态库的优点之一是占用内存空间-共享库仅在内存中保留一个副本,这减小了可执行程序的大小。

更改外部程序的情况并不罕见-如果是这种情况,则静态库将需要重新编译并重新链接,以便在当前可执行文件中进行更新。 使用共享库,这是不必要的。

静态库也有其自身的优势:首先,使用静态库的程序可以说比使用动态库的程序快。 此外,静态库不太可能遇到兼容性问题。

  gcc -c -fPIC * .c 

上面的代码将使用标志-fPIC(位置无关的代码)编译所有.c文件,这意味着生成的机器代码将不依赖于特定的地址才能正常工作。

  gcc -shared -o liball.so * .o 

现在,可以通过获取所有.o文件并使用-shared标志使之成为共享库,将目标文件编译为动态库。 编译器通过查找以’lib’开头并以库扩展名结尾的文件来标识库。

  nm -D liball.so 

如果要查看功能列表,可以使用nm -D

export LD_LIBRARY_PATH=:$LD_LIBRARY_PATH 

为了使程序成功找到自定义库,我们需要添加LD_LIBRARY_PATH作为环境变量。

  $ gcc -L。  -lall -o myfile.c main.c 

上面的代码编译了共享库-“ -L”。 表示共享库位于当前目录中,-lall包括所有库文件并专门查找liball。

  $ gcc -Wall -Werror -Wextra -pedantic -c * .c 

使用以上命令,当前工作目录中的所有.c扩展文件都将转换为目标文件。 只有拥有相应的目标文件后,我们才使用下面的命令来创建库。

  $ ar -rc libname.a * .o 

归档程序 aka ar 可以创建,修改和提取归档文件。 归档文件是一个单一文件,该文件在结构上可容纳其他文件的集合,从而可以检索原始的单个文件。

标志-c告诉ar创建档案。 标志-r插入成员文件,并在需要时替换较旧的文件(在这种情况下为* .o文件)。

看起来好像已经完成了,但是请稍等! 我们仍然需要使用以下命令为我们的库建立索引。

  $ ranlib libname.a 

该索引对于列出每个符号并定义作为可重定位目标文件的存档成员是必需的。 这使可能包含数百个符号的库可以快速找到特定程序的相应参考符号。

根据计算机系统的不同,您可能需要也可能不需要ranlib。

  $ gcc main.c -L。  -lholberton -o主 

一旦以上命令建立,您就可以通过运行./main来执行它。