什么是DLL
DLL(Dynamic Link Library),动态链接库,linux下是.so
文件,win下是.dll
文件。
之所以需要库,是因为可以进行代码解耦和代码重用,由库文件对外提供服务,如exe
调用dll
。还有一个作用就是在不希望别人看到源码但需要使用我们的功能时隐藏源码。
- 静态库
- win下是
.lib
文件,linux下是.a
文件 - 它作为程序的一个模块,在链接期间被合并到程序中
- win下是
- 动态链接库
- win下是
.dll
文件,linux下是.so
文件 - 动态库在程序运行阶段被加载到内存。dll和exe是独立的两个文件,别人随时可以调用
- win下是
使用gcc生成动态链接库
生成.so
文件需要使用-shared
选项生成动态链接库。此外还需要结合-fPIC
选项,编译阶段告诉编译器生成与位置无关的代码,这样一来代码中使用的就是相对地址了,可以被加载到内存的任意位置。这正是共享库需要的。
1 | # 从源文件生成dll |
将动态链接库链接到可执行文件
1 | gcc main.c libfunc.so -o app.out |
gcc生成静态库
linux下静态链接库是以.a
文件结尾的二进制文件,它作为程序的一个模块,在链接期间被合并到程序中。
- 首先把源文件编译为目标文件,即
.o
文件gcc -c <src.c ...>
-c
只编译不链接
- 使用
ar
命令将.o
文件打包成静态链接库ar rcs <libname.a> <obj1.o ...>
ar
是一个备份(归档)压缩命令r
参数用来替换库中已有的目标文件,或加入新的目标文件c
参数表示创建一个库,无论是否存在s
参数用来创建目标文件索引
使用静态库
使用静态库需要引入对应的头文件,比较规范的目录格式如下:
1 | |-- include |
编译时使用-I
参数指明头文件路径,使用-L
指明静态库路径,使用-l
(小写L)指明静态库名称,即去掉lib前缀和.a
后缀的名称
1 | gcc <src> -I <include> -L <lib> -l <libname> |