2. Linux 下制作动态库

本节课我们来将上节课的合作方写好的四个文件: file1.cfile1.hfile2.cfile2.h 在 Linux 操作系统平台上 使用 GCC 编译器制作成静态库 libmylib.a。然后将静态库和主程序 main.c 合并生成一个可执行文件 myapp

GCC 生成静态库步骤:

  1. 将源文件编译为目标文件(.o文件)。
  2. 使用 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 命令选项

最后 libmylib.a 就是最后的静态库文件。合作方需要将此文件连同 两个头文件 file1.hfile2.h 一起提供给 项目发布方才能够编译成为可执行文件。

项目发布方使用 libmylib.a 编译成为可执行文件的过程如下,假设静态库文件即头文件 file1.hfile2.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编译选项说明:

这样我们就完成了静态库的制作和链接。使用静态库生成的可执行程序不依赖静态库文件,因此软件发布时可以不携带静态库文件发布。

实验

尝试使用你自己的编译器完成静态库的制作。