抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

什么是DLL

DLL(Dynamic Link Library),动态链接库,linux下是.so文件,win下是.dll文件。

之所以需要库,是因为可以进行代码解耦和代码重用,由库文件对外提供服务,如exe调用dll。还有一个作用就是在不希望别人看到源码但需要使用我们的功能时隐藏源码。

  • 静态库
    • win下是.lib文件,linux下是.a文件
    • 它作为程序的一个模块,在链接期间被合并到程序中
  • 动态链接库
    • win下是.dll文件,linux下是.so文件
    • 动态库在程序运行阶段被加载到内存。dll和exe是独立的两个文件,别人随时可以调用

使用gcc生成动态链接库

生成.so文件需要使用-shared选项生成动态链接库。此外还需要结合-fPIC选项,编译阶段告诉编译器生成与位置无关的代码,这样一来代码中使用的就是相对地址了,可以被加载到内存的任意位置。这正是共享库需要的。

1
2
3
4
5
# 从源文件生成dll
gcc -fPIC -shared func.c libfunc.so
# 从目标文件生成dll
gcc -fPIC -c func.c -o func.o
gcc -shared func.o -o libfunc.so

将动态链接库链接到可执行文件

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
2
3
4
5
6
|-- include
| -- 存放头文件
|-- lib
| -- 存放库文件
|-- src
| -- 存放源文件

编译时使用-I参数指明头文件路径,使用-L指明静态库路径,使用-l(小写L)指明静态库名称,即去掉lib前缀和.a后缀的名称

1
gcc <src> -I <include> -L <lib> -l <libname>

评论