什么是C动态库和静态库?

C语言编译后生成的可执行程序包含两种类型的库:动态库和静态库。静态库直接嵌入到可执行程序中,因此文件体积较大;动态库则独立于程序外存在,程序需要时动态加载。动态库可以实现多个程序共享同一份动态库,大大节约了磁盘空间。同时动态库也更加灵活,程序在运行时可以动态加载、卸载新的库。而静态库则无法实现。静态库包含了所有程序需要的信息,i因此它可以独立于环境运作,但是一旦需要更新库,就需要重新编译程序,消耗了大量时间。

如何调用静态库?

在编译程序时,我们可以向编译器指定静态库的路径和名称。这样编译器就可以将这些库的目标文件添加到生成的可执行文件中,从而可以一同发布和运行。一般情况下,使用静态库需要引用头文件和链接静态库文件,能够方便地检查被调用函数的参数和返回值,而且不会受到动态库版本的影响。

如何将静态库调用方式转为动态库?

转变静态库的方式为动态库的方式不同于直接编写可执行文件,需要编写一个动态库文件,在编译时打包生成一个.c文件和.h头文件,就可以生成一个动态库。C语言中的动态库由两部分组成:链接库和导出表,链接库是当前操作系统下可用的一些函数库,导出表则是动态链接库中特别标识出来的函数列表。
为了实现动态库的调用,我们需要先以静态库的方式编写C代码,并在编译时将其制作成可重定位目标文件,也称为目标文件。然后再将目标文件制作成动态库格式,并生成动态连接库(.dll)、共享目录链接库(.so)等格式。在生成的动态库文件中,包含了函数列表、符号表及一些其他信息,程序在运行中会到系统的动态链接库中查找需要的动态链接库,共享库查找路径在LD_LIBRARY_PATH中。
由此可见,动态库更加灵活,可在程序运行过程中动态加载,可以方便地修改、更新。但同时,动态库的性能要稍逊于静态库,因为动态库的调用涉及到链接器和加载器两个过程,会增加程序的运行负担。在开发过程中,我们需要根据实际需求综合考虑,采用最适合的库的调用方式。