目录
一、介绍
1、静态库
2、动态库
二、操作
1、静态库
2、动态库
3、使用库文件
(1)方法一
(2)方法二
(3)方法三
一、介绍
1、静态库
静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码直接复制到程序文件的适当位置,最终生成可执行文件。
使用静态链接库生成的文件通常体积较大,但运行时不再依赖库文件,可以拷贝到别的设备上运行。
在Linux中静态链接库文件的后缀名通常用 .a 表示;在Windows系统中,静态链接库文件的后缀名为 .lib。
2、动态库
动态链接库,又称为共享链接库。和静态链接库不同,采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件。
使用动态链接库生成的文件通常体积较小,但运行时依赖库文件。
在Linux中,动态链接库的后缀名通常用 .so 表示;在Windows系统中,动态链接库的后缀名为 .dll。
二、操作
1、静态库
通常情况下GCC在编译过程中默认使用动态链接库,我们可以使用 -static 选项指定使用静态链接库。
需要注意,库名格式为:libxxx.a
ar rcs 静态链接库名称 目标文件1 目标文件2 ...
# demo
gcc -c demo1.c -o demo1.o
gcc -c demo2.c -o demo2.o
# 生成静态库 demo.a
ar rcs demo.a demo1.o demo2.i
2、动态库
可将不包含 main 函数的一个或多个文件打包为动态库文件。
需要注意,库名格式为:libxxx.so
# 若出错,可以将 -fpic 换位 -fPIC
gcc -fpic -shared 源文件名... -o 动态链接库名
3、使用库文件
在Linux 中,库文件的搜索路径除了默认的搜索路径外(/lib 或 /lib64 或者 /usr/lib),还可通过三种方法来指定:
(1)方法一
linux 主机下 /etc/ld.so.conf 配置文件中指定库文件搜索路径为:include ld.so.conf.d/*.conf
我们可以在 /etc/ld.so.conf.d 文件夹下创建后缀为 conf 的配置文件,并将需要搜索的库文件路径添加进去。
添加完后需要使用 ldconfig 刷新缓存。
下面以 mariadb-x86_64.conf 为例,如下图所示:
(2)方法二
通过环境变量 LD_LIBRARY_PATH 指定库文件搜索路径(临时的,只在当前shell下生效);
# 获取当前路径(绝对路径)
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
# 添加依赖搜索路径(当前路径下的 lib/linux_64 目录)
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${SHELL_FOLDER}/lib/linux_x64
(3)方法三
在编译目标代码时指定该程序的库文件搜索路径。
使用 gcc 或 g++ 时可以使用 -rpath
在生成的可执行文件中设置运行时库搜索路径,告知动态链接器在哪些目录下查找库文件。
需要注意与 -L 参数进行区分:-L
参数只影响链接器在链接过程中查找库文件的路径,而 -rpath
参数影响动态链接器在程序运行时查找库文件的路径。
g++ -Wl,-rpath=/usr/local/lib/ -oevh libevent_http.cpp -levent
--------------------------------------------------------------
--------------------------------------------------------------
GPT生成的废话,混分用
--------------------------------------------------------------
--------------------------------------------------------------
动态库(Dynamic Link Library,简称DLL,在Linux/Unix系统中通常以.so后缀)与静态库(Static Library,在Unix-like系统中通常以.a后缀,Windows上则为.lib,但通常用于导入库)是程序开发中用于代码重用和模块化的两种重要方式。它们各自具有独特的特点和用法,下面将详细介绍两者之间的区别和联系。
动态库
定义与特点:
- 动态库是一个包含可由多个程序同时使用的代码和数据的库。这些代码和数据在程序运行时被加载到内存中,供程序调用。
- 动态库允许不同的程序共享同一份库文件,从而节省磁盘空间和内存。
- 由于动态库的内容不会直接包含在可执行文件中,因此使用动态库的程序在运行时需要能够找到并加载库文件。
编译与链接:
- 在编译阶段,编译器会为程序生成对动态库中函数的引用,而不是将函数的实际代码复制到可执行文件中。
- 在链接阶段,链接器会处理这些引用,并生成一个包含必要信息的可执行文件,以便在运行时由动态链接器(如Windows上的Loader.exe或Linux上的ld.so)加载动态库。
运行时行为:
- 当程序运行时,动态链接器会查找并加载所需的动态库文件到内存中。
- 程序通过动态链接器提供的接口调用动态库中的函数。
- 如果动态库文件不存在或版本不兼容,程序可能无法正常运行。
优点与缺点:
- 优点:节省磁盘空间和内存(因为多个程序可以共享同一份库文件);便于更新和维护(只需更新库文件即可影响所有使用该库的程序)。
- 缺点:存在依赖问题(程序需要找到并加载库文件才能运行);在某些情况下可能导致性能下降(因为存在额外的加载和解析时间)。
静态库
定义与特点:
- 静态库是在编译时将库中的代码和数据直接复制到可执行文件中的库。
- 一旦静态库被链接到程序中,程序就可以在没有静态库文件的情况下独立运行。
编译与链接:
- 在编译阶段,程序员会编写源代码并生成对象文件(.o或.obj文件)。
- 在链接阶段,链接器会将这些对象文件以及静态库中的代码和数据合并成一个可执行文件。
运行时行为:
- 由于静态库的内容已经被直接包含在可执行文件中,因此使用静态库的程序在运行时不需要再加载库文件。
优点与缺点:
- 优点:程序可以独立运行(不需要库文件);避免了动态链接的依赖问题。
- 缺点:导致可执行文件体积增大(因为包含了静态库的全部内容);如果多个程序都使用了相同的静态库,则会造成代码冗余和磁盘空间的浪费;不利于库的更新和维护(因为需要重新编译和链接所有使用该库的程序)。
总结
动态库和静态库各有优缺点,选择哪种库取决于具体的应用场景和需求。在需要节省磁盘空间和内存、便于更新和维护的场景下,动态库是更好的选择;而在需要程序独立运行、避免依赖问题的场景下,静态库则更为合适。在实际开发中,可以根据项目的具体需求灵活选择使用动态库还是静态库。