动态库和静态库
库是一种代码的二进制分装
在其他的源代码中,可以直接调用,但是你可能看不到
具体的代码(没有公开源代码)。把库文件看出一个代码
仓库,他可以提供一些变量、函数等。。
库分为静态库和动态库
1.动态库
动态库的使用步骤:
(1)编辑源代码
xxx.c 功能函数的实现
xxx.h 函数以及数据类型的声明等 “文件接口”
。。。
。。。
NOTE:一般来说 库的源代码 不能包含 main 函数
(2)将你所编辑的代码生成动态库
(arm-linux-)gcc -shared -fpic -o libxxx.so xxx.c yyy.c ..
把xxx.c yyy.c ...编译生成动态库
动态库的名字:libxxx.so 一定是lib开头 .so 结尾
-shared:生成一个动态库(共享库)
-fpic:与位置无关
-o:output 指定生成动态库的名字,或输出的名字
(3)把头文件和库拷贝给需要用的人
main.c
<----- libxxx.so
<----- xxx.h
(arm-linux-)gcc main.c -o main
(Include) -I 接一个目录名 指定头文件的搜索路径
可以接多个 -I
(lib) -l 指定一个需要用到库的名字(除去前面的lib和
后面的.so) 可以指定多个 -l
(Lib) -L 指定一个库的搜索路径 可以有多个-L
eg:
gcc main.c -o main -L ./sum -l sum -I ./sum
执行了上面命令生成了一个可执行文件main
可执行文件main会使用到我们的libsum.so 这个库
但是在生成main的时候 他并没有将库的内容直接拷贝
到这个main里面去 只是在main里面做了一个标记,
所以当我们直接去运行这个可执行文件的时候,
他会报错 因为他首先就去查找所依赖的库
./main: error while loading shared libraries:
libsum.so: cannot open shared object file: No such file or directory
(4)运行时刻,需要把可执行文件的动态库要下载到目标板上
并且还要指定动态库的搜索路径。
Linux 系统有一个环境变量 LD_LIBRARY_PATH
LD : 加载
LIBRARY:库
PATH:路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/cs2217/交叉开发/3.动态库和静态库/code/sum
2.静态库
在使用静态库的时候,是把静态库的内容拷贝到可执行文件中去
这样的话,就不需把静态库放到目标板。
静态库的使用步骤:
(1)编译源代码
a.c / a.h
b.c / b.h
.......
(2)把各个源文件编译成一个.o 文件
a.c ---> a.o (arm-linux-) gcc -c a.c -o a.o
b.c ......................................
c.c ..................
.....
(3)用 ar 命令把所以的.o 文件 生成静态库
ar -cvr libxxx.a a.o b.o ....
把这些.o 文件 生成一个静态库: libxxx.a
静态库是以lib开头 .a结尾
(4)把头文件和库拷贝给需要用的人
main.c
<----- libxxx.a
<----- xxx.h
(arm-linux-)gcc main.c -o main
(Include) -I 接一个目录名 指定头文件的搜索路径
可以接多个 -I
(lib) -l 指定一个需要用到库的名字(除去前面的lib和
后面的.a) 可以指定多个 -l
(Lib) -L 指定一个库的搜索路径 可以有多个-L
eg:
gcc main.c -o main1 -L ./sum -l sum -I ./sum
编译完就生成一个main1可执行文件 那么这个可执行文件里面
就包含静态库里面的内容 所以用到这个可执行文件的时候
只需要直接运行即可
3.动态库和静态库的区别
动态库和静态库都是二进制的分装形式
区别:
对于动态库,编译可执行文件时,并没有把动态库的内容拷贝到可执行文件中去
只是做了个标记,表面可执行文件需要用到某某动态库,这样的话,运行该执行
文件的时候,需要把所用到的动态库跟可执行文件一起带走,并且配置环境变量
对于静态库,编译可执行文件时,会把静态库的内容链接到可执行文件中去
运行该可执行文件的时候,就不需要静态库了
动态库的两个明显的优势:
(1)运行时刻,动态库在内存中指拷贝一份
而静态库的话,则会有多个拷贝(看多少个程序在使用它)
(2)当接口,更新动态库的时候 不需要重新编译依赖该动态库的工程文件
如果你是静态库 修改 则需要重新编译依赖该静态库的所有工程文件