Linux的库
在Linux中,标准的库文件一般存放在/lib和usr/lib的目录中。c语言编译器gcc(更确切的说是链接程序)需要知道要搜索哪些库文件,因为默认情况下,它只搜索标准C语言库。仅仅把库文件放在标准目录中就希望C语言编译器gcc能够找到它是不够的,库文件必须遵循特定的命名规范并且需要在命令行中明确指定。函数库通常以静态库和动态库两种格式存在。
1.静态库
在程序执行前(编译)就加入到目标程序中 。
1.1优缺点
优点:
1.静态库被打包到应用程序中加载速度快。
2.发布程序无需提供静态库,因为已经在执行文件中,移植方便。
缺点:
1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝,浪费内存空间。
2.更新、部署、发布麻烦。
2.2命名规则
静态库文件名的命名方式是**“libxxx.a”**
库名前加“lib”,后缀用“.a”,“xxx”为库名
2.3制作与使用
add.h
#ifndef HELLO_H
#define HELLO_H
void hello(int a,int b);
#endif
add.c
#include <stdio.h>
void add(int a,int b)
{
int c;
c =a+b;
printf("%d+%d=%\n", a,b,c);
}
main.c
#include<stdio.h>
#include "add.h"
int main(int argc, char * argv[])
{
int a;
int b;
scanf("%d",&a);
scanf("%d",&b);
add(a,b);
return 0;
}
将hello.c编译成静态库文件,步骤如下
- 生成“.o”文件:gcc add.c -c
- 将“.o”文件打包,生成静态库文件
ar rcs libadd.a add.o
ar rcs:静态库打包指令
libadd.a:静态库名字
add.o:原材料
静态库的使用
**gcc main.c -ladd -L ./ **
-L:告诉gcc编译器从-L制定的路径去找静态库。默认是从/usr/lib ,/usr/local/lib去找
./:当前路径
gy@ubuntu:~/library$ gcc add.c -c
gy@ubuntu:~/library$ ar rcs libadd.a add.o
gy@ubuntu:~/library$ ls
add.c add.h add.o libadd.a main.c
gy@ubuntu:~/library$ gcc main.c -ladd -L ./
gy@ubuntu:~/library$ ./a.out
-------------
input num1:
1
input num2:
2
result:
1+2=3
-------------
2.动态库
在程序执行时动态(临时)由目标程序去调用
2.1优缺点
优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多 个程序可以共用,节省内存。
2.程序升级简单,因为程序里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库
2.2命名规则
静态库文件名的命名方式是libxxx.so.x.y.z
库名前加“lib”,后缀用“.os”,“xxx”为库名
.x.y.z为主/次/发行版本号
2.3制作与使用
add.h
#ifndef HELLO_H
#define HELLO_Hx
void hello(int a,int b);
#endif
add.c
#include <stdio.h>
void add(int a,int b)
{
int c;
c =a+b;
printf("%d+%d=%\n", a,b,c);
}
main.c
#include<stdio.h>
#include "add.h"
int main(int argc, char * argv[])
{
int a;
int b;
scanf("%d",&a);
scanf("%d",&b);
add(a,b);
return 0;
}
将hello.c编译成动态库文件,步骤如下
- 生成“.o”文件:gcc add.c -c
- 将“.o”文件打包
gcc -shared -fpic add.o -o libadd.so
-shared: 指定生成动态库
-fpic: 生成位置无关的代码(标准)
libadd.os:动态库名字
动态库的使用
gcc main.c -I /usr/include -ladd -L ./
-L:-告诉gcc编译器从-L制定的路径去找动态库。默认是从/usr/lib /usr/local/lib去找
./:当前路径
linux动态库(.so)搜索路径(目录)设置方法
- cp libadd.os /usr/lib
- export LD_LIBRARY_PATH=动态库的路径:$LD_LIBRARY_PATH(shell关闭后失效)
gy@ubuntu:~/library$ gcc add.c -c
gy@ubuntu:~/library$ gcc -shared -fpic add.o -o libadd.so
gy@ubuntu:~/library$ ls
add.c add.h add.o a.out libadd.so main.c
gy@ubuntu:~/library$ ./a.out
./a.out: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
gy@ubuntu:~/library$ export LD_LIBRARY_PATH=/home/gy/library:$LD_LIBRARY_PATH
gy@ubuntu:~/library$ ./a.out
-------------
input num1:
1
input num2:
1
result:
1+1=2
-------------
- 长期的使用可以建立一个.sh文件
gy@ubuntu:~/library$ vi open.sh
export LD_LIBRARY_PATH=/home/gy/library:$LD_LIBRARY_PATH
./a.out
gy@ubuntu:~/library$ sh open.sh
-------------
input num1:
参考链接:
https://www.cnblogs.com/progamming/p/13043652.html
https://www.cnblogs.com/sunsky303/p/7731911.html