第二十二章、动态库和静态库
1. 动态库和静态库概述
在软件开发的过程中经常需要多人合作开发或者公司和公司之间合作开发。那么如何合作呢?
软件合作的方式通常有以下几种
- 源代码交付,合作者提供源代码,由软件发布者统一编译发布。
- 静态库交付,合作者提供源代码编译后的二进制静态库,软件发布者在链接阶段合并到可执行程序。 这样可以避免源码泄露,又能达到提供源代码一样的效果。
- 动态库交付,合作者提供源代码编译后的二进制动态库,软发发布者在可执行程序运行时动态加载动态库,对其中的函数和变量进行使用。
静态和动态的概念
- 静态 是指编译时状态。
- 动态 是指运行时状态。
静态库(Static Library) 是指在链接时将库的代码完整的合并到可执行程序中的软件部分。静态库文件的扩展名通常是 .a(Linux/Unix)或 .lib(Windows)。
动态库(Dynamic Library) 是指在运行时,在需要使用的时候需要动态加载到内存中并进行使用的软件部分。库文件的扩展名通常是 .so(Linux)、.dylib(Mac OS)或 .dll(Windows)。
本章将以 Linux 为例,在 Linux 操作系统平台上用同一段代码来制作静态库和动态库,并使用不同的方式来使用其中的函数。
假设现在有合作方写好的四个文件: file1.c、file1.h、file2.c、file2.h,内容如下:
file1.c 内容如下:
// filename: file1.c
#include <stdio.h>
#include "file1.h"
void myfunc1(void) {
printf("库函数 myfunc1 被调用\n");
}
file1.h 内容如下:
// filename: file1.h
#ifndef __FILE1_H
#define __FILE1_H
void myfunc1(void);
#endif // __FILE1_H
file2.c 内容如下:
// filename: file2.c
#include <stdio.h>
#include "file2.h"
void myfunc2(void) {
printf("库函数 myfunc2 被调用\n");
}
file2.h 内容如下:
// filename: file2.h
#ifndef __FILE2_H
#define __FILE2_H
void myfunc2(void);
#endif // __FILE2_H
现在有软件发布方写的一个文件: main.c,内容如下:
// filename: main.c
#include "file1.h"
#include "file2.h"
int main(int argc, char * argv[]) {
// 调用合作方的库函数
myfunc1();
myfunc2();
return 0;
}
以上直接使用源代码的方式编译和运行结果如下:
weimingze@mzstudio:~$ ls
file1.c file1.h file2.c file2.h main.c
weimingze@mzstudio:~$ gcc -o file1.o -c file1.c # 汇编成目标文件
weimingze@mzstudio:~$ gcc -o file2.o -c file2.c
weimingze@mzstudio:~$ gcc -o main.o -c main.c
weimingze@mzstudio:~$ gcc -o myapp main.o file1.o file1.o # 链接
weimingze@mzstudio:~$ ./myapp
库函数 myfunc1 被调用
库函数 myfunc2 被调用
可见使用源代码编译是没有问题的,但如果合作方不给我们源代码,这是时我们可以要求合作方给我们一个动态库或静态库。