2. Linux 下制作动态库
本节课我们来将上节课的合作方写好的四个文件: file1.c、file1.h、file2.c、file2.h 在 Linux 操作系统平台上 使用 GCC 编译器制作成静态库 libmylib.a。然后将静态库和主程序 main.c 合并生成一个可执行文件 myapp。
GCC 生成静态库步骤:
- 将源文件编译为目标文件(
.o文件)。 - 使用
gcc工具链的ar命令打包为静态库。
编译为目标文件可以使用 gcc 命令的 -c 选项进行编译,使用 -o 进行输出,如果给出 -o 选项则默认使用 .c 的文件名。
如下所示
weimingze@mzstudio:~$ ls
file1.c file1.h file2.c file2.h
weimingze@mzstudio:~$ gcc -c file1.c
weimingze@mzstudio:~$ gcc -c file2.c
weimingze@mzstudio:~$ ls
file1.c file1.h file1.o file2.c file2.h file2.o
下面我们使用编译好的目标文件生成静态库文件libmylib.a,Linux/UNIX 下的静态库文件要求以 lib 开头,以 .a 结尾,中间才是库的名称。
使用 gcc 工具链的 ar 命令可以将 目标文件打包成为静态库文件。如下所示:
weimingze@mzstudio:~$ ar rcs libmylib.a file1.o file2.o
weimingze@mzstudio:~$ ls
file1.c file1.h file1.o file2.c file2.h file2.o libmylib.a
ar 命令选项
- r:替换已存在的成员
- c:创建库
- s:创建索引
最后 libmylib.a 就是最后的静态库文件。合作方需要将此文件连同 两个头文件 file1.h、file2.h 一起提供给 项目发布方才能够编译成为可执行文件。
项目发布方使用 libmylib.a 编译成为可执行文件的过程如下,假设静态库文件即头文件 file1.h和 file2.h 都存在于 mylib1 文件夹下,结构如下所示
weimingze@mzstudio:~$ tree .
.
├── main.c
└── mylib1
├── file1.h
├── file2.h
└── libmylib.a
使用 GCC 生成可执行程序的过程如下:
weimingze@mzstudio:~$ gcc -c main.c -I mylib1
weimingze@mzstudio:~$ gcc -o myapp main.o -L mylib1 -l mylib
weimingze@mzstudio:~$ ./myapp
库函数 myfunc1 被调用
库函数 myfunc2 被调用
gcc编译选项说明:
-I <路径>选项是指定头文件的包含路径。-L <路径>选项是指定库文件的搜索路径。-l <名称>选项是指定库文件名,不用添加前缀lib和 后缀.a。
这样我们就完成了静态库的制作和链接。使用静态库生成的可执行程序不依赖静态库文件,因此软件发布时可以不携带静态库文件发布。
实验
尝试使用你自己的编译器完成静态库的制作。