一、静态库与动态库的区别
库有动态与静态两种,动态通常用 .so 为后缀,静态用 .a 为后缀。例如:libhello.so 表示一个命名为 libhello 的动态库,libhello.a 则是一个命名为 libhello 的静态库。
当使用静态库时,连接器找出程序所需的函数,并将其拷贝到可执行文件,一旦链接成功,静态程序库就不再需要了;而动态库则会在执行程序内留下一个标记指明,当程序执行时,首先必须载入这个库。由于动态库节省空间,linux 下进行连接的缺省操作是首先连接动态库。
二、静态函数库的创建与链接
1. 编译生成 .o 文件
编译当前路径下的所有后缀名为 .c 的源程序文件,生成同名的 .o 目标文件
gcc -c *.c
2. 创建静态库
使用 ar 命令,生成库名为 mytest 的静态函数库 libmytest.a,存放 a.o 和 b.o 两个模块
ar -srv libmytest.a a.o b.o
3. 链接静态库生成可执行文件
链接当前路径下的 libmytest.a 函数库,生成 main.exe 可执行文件
gcc main.o -o main.exe libmytest.a
4. 运行
./main.exe
三、动态函数库
为了方便管理,通常在工程目录下创建 src、inc、lib 等目录,src 目录存放后缀名为 .c 的源程序文件,inc 存放后缀名为 .h 的头文件,lib 存放库文件。以下命令以该目录结构为例嘻嘻~
1. 编译生成.o文件
./src/*.c
表示 src 目录中的所有 .c 文件,-I ./inc
表示将 inc 目录加入到程序头文件目录列表中(inc 目录用于存放 .h 文件)
gcc -c -fPIC ./src/*.c -I ./inc
2. 创建动态库
./lib/libmytest2024.so
表示在 lib 目录下生成 libmytest2024.so 动态库,需要先创建 lib 目录,否则报错没有那个文件或目录。
gcc -shared -fPIC -o ./lib/libmytest2024.so a.o b.o
3. 链接静态库生成可执行文件
-L ./lib/ -lmytest2024
表示将当前目录下的 lib 目录加入到程序函数档案库文件目录列表中,链接名字为 mytest2024 的库文件。默认库文件路径:/usr/lib/
gcc ./src/main.c -o app2024 -L ./lib/ -lmytest2024 -I ./inc
4. 复制静态库到本机的 /lib 目录下
sudo cp ./lib/libmytest2024.so /lib
5. 运行
./app2024
测试代码
1)main.c
#include "a.h"
#include "b.h"
int main() {
a();
b();
return 0;
}
2)a.c
#include <stdio.h>
void a() {
printf("宫廷玉液酒\n");
}
3)b.c
#include <stdio.h>
void b() {
printf("一百八一杯\n");
}
4)a.h
#ifndef _a_H_
#define _a_H_
void a();
#endif
5)b.h
#ifndef _b_H_
#define _b_H_
void b();
#endif
演示结果