一、 库的介绍:
1. 库的概念:
事先已经编译好的代码,经过编译后可以直接调⽤的⽂件。
本质上来说是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。
2. 系统库:/usr/lib、/usr/lib64
3. 库文件名:lib + 库名 + 后缀(.a为静态库;.so为动态库)
二、 静态库与动态库:
1. 静态库:
静态库的代码在编译时就已经拷⻉到应⽤程序中。
当有多个程序同时引⽤⼀个静态库函数时,内存中将会生成该函数的多个副本。
完全拷⻉,⼀旦连接成功,静态库就不再需要了。
程序代码体积⼤。
2. 动态库:
在程序内留下⼀个标记,指明当程序执⾏时, ⾸先必须要载⼊这些库。
在程序开始运⾏后调⽤库函数时才被载⼊,被调⽤函数在内存中只有⼀个副本。
程序代码体积⼩。
三、 静态库的创建和使用:
创建步骤:
- 在头⽂件(.h)中声明静态库所导出的函数
- 在源⽂件(.c)中实现静态库所导出的函数
- 编译源⽂件,⽣成⽬标⽂件(.o)
- 通过命令 ar 将⽬标⽂件加⼊到静态库中
- 将静态库拷⻉到系统默认的存放库的路径(/usr/local/lib、/usr/local/include),或指定的路径下
使用命令:
- gcc [源文件] -o [可执行文件名] -I[头文件路径] -L[静态库路径] -l[静态库名]
- -l :指示编译器,装载的函数库,系统默认的路径(/usr/lib、/usr/lib64)
- -L:指定库所在的路径
- -I :指定头文件所在的路径
示例及详解:
1. 头文件与源文件的编写:共 5 个文件。

other1.h
#ifndef OTHER1_H
#define OTHER1_H
#include <stdio.h>
void welcome();
#endif
other1.c
#include "other1.h"
void welcome(){
printf("Welcome to MyProject!\n");
}
other2.h
#ifndef OTHER2_H
#define OTHER2_H
#include <stdio.h>
int add(int, int);
int sub(int, int);
#endif
other2.c
#include "other2.h"
int add(int x,int y){
return x+y;
}
int sub(int x, int y){
return x-y;
}
app.c
#include "other1.h"
#include "other2.h"
void main(){
int a=15, b=3,c;
printf("test in app\n");
welcome();
c=add(a,b);
printf("%d + %d = %d\n",a,b,c);
c=sub(a,b);
printf("%d - %d = %d\n",a,b,c);
}
示例:此结构下编译 3 个 c 文件,生成可执行程序 app
2. 编译源文件:生成目标文件 .o
gcc -c other1.c -o other1.o
gcc -c other2.c -o other2.o
3. 加入到静态库:
ar rcs libother1.a other1.o
ar rcs libother2.a other2.o
示例:此结构下编译 app.c 文件
gcc app.c -o app -I./ -L./ -lother1 -lother2
4. 组织项目:
include 存放头文件、lib 存放库文件、src 存放源代码。
示例:此结构下编译 app.c 文件
gcc app.c -o app -Iinclude -Llib -lother1 -lother2
5. 加入系统默认存放库的路径:
将头文件和库文件拷贝到 /usr/local 对应目录下
cp include/* /usr/local/include
cp lib/* /usr/local/lib
调用系统库编译文件
gcc app.c -o app -lother1 -lother2
四、动态库的创建和使用:
创建步骤:
- 在头⽂件(.h)中声明动态库所导出的函数
- 在源⽂件(.c)中实现动态库所导出的函数
- 编译源⽂件,⽣成与位置⽆关的⽬标⽂件 (.o)
- 创建动态库
- 链接动态库
使用命令:
- 方式一:gcc [源⽂件] -L [动态库路径] -l [动态库名] -I [头⽂件路径] -o [可执⾏⽂件]
- 方式二:gcc [源⽂件] -I [头⽂件路径] [完整库⽂件名] -o [可执⾏⽂件]
示例及详解:
1. 编写头文件与源文件:与上例静态库中的文件相同。
2. 编译源文件并生成与位置无关的目标文件:
gcc -fPIC *.c -I ../include -c
3. 创建动态库:
gcc -shared -o liblinux_test.so *.o
mv liblinux_test.so ../lib
利用方式二进行链接编译代码:
#注意给定的为绝对路径
gcc app.c -I include $(pwd)/lib/liblinux_test.so -o app
4. 链接动态库:
LD_LIBRARY_PATH:指定除默认路径外查找动态库的路径,该路径在默认路径前进⾏查找。
- export LD_LIBRARY_PATH=[⾃定义动态库路径],起到临时作⽤
- 配置环境变量 LD_LIBRARY_PATH,修改文件 ~/.bash_profile 或 ~/.bashrc 或 /etc/profile 或 /etc/bashrc
- 直接将动态库拷贝⾄/usr/lib等系统⽬录下(可⾏但强烈不推荐)
- 将动态库的绝对路径写⼊/etc/ld.so.conf⽂件,使⽤ldconfig命令更新(推荐使用)
利用方式一链接编译代码:
gcc app.c -Llib -llinux_test -I include -o app
此时直接运行会报错,输入 ldd app 提示找不到动态库的位置,解决方法如下:
①设置临时环境变量: export LD_LIBRARY_PATH=$(pwd)/lib
②配置环境变量: 编辑上述任意文件,添加语句 export LD_LIBRARY_PATH=/myCode/c/linux_about_lib/dynamic/lib 。
③加入系统库:本文不做演示。
④将绝对路径写⼊ /etc/ld.so.conf :vim /etc/ld.so.conf
完成后进入 /etc/ 文件夹,输入 ldconfig 更新,并可找到目录:
成功运行文件