一、静态库和动态库的区别
1. 静态函数库
这类库的名字一般是libxxx.a;由静态函数库编译的文件有很大的空间,因为整个函数库中的所有数据都将集成到目标代码中,其优点显而易见,即编译后的执行程序不需要外部函数库的支持,因为所有使用的函数都已被编译。当然,这也会成为他的缺点,因为如果静态函数库改变,你的程序必须重新编译。
2. 动态函数库
这类库的名字一般是libxxx.so;与静态函数库相比,动态函数库在编译时没有被编译成目标代码。当您的程序执行到相关函数时,调用函数库中的相应函数,因此动态函数库产生的可执行文件相对较小。由于函数库没有集成到您的程序中,而是在程序运行过程中动态应用和调用时间,因此必须在程序运行环境中提供相应的库。动态函数库的变化不会影响您的程序,因此动态函数库的升级/更新更方便。
二、静态库
(一)简单介绍
/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc \
main.c src/* -I./include -L./lib -lmpi -o main
/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc 交叉编译工具链
\换行意味着下一行与当行为相同,‘\后面没有空间
main.c 为主函数
src/* 为源文件
-I接头文件后面
-L接收文件后面的路径路径
-l接收文件名后,全名libmpi.a
.a为静态库
(二)准备和使用静态仓库
(1)设计库源码 pr1.c、pr2.c 和 main.c
代码如下:
pr1.c如下:
#include <stdio.h>
void print1(void)
{
printf("This is the first lib src!\n");
}
pr2.c如下:
#include<stdio.h>
void print2(void)
{
printf("This is the second src lib!\n");
}
main.c如下:
int main(void)
{
print1();
print2();
return 0;
}
(2) 编译pr1.c、pr2.c 文件
gcc -O -c pr1.c pr2.c
ls -l pr*.o
-rw-rw-r-- 1 bill bill 804 4 月 15 11:11 pr1.o
-rw-rw-r-- 1 bill bill 804 4 月 15 11:11 pr2.o
(3) 链接静态库
为了在编译过程中正确找到库文件,必须遵循静态库 lib[name].a 的规则命名,如下例中[name]=pr.
ar参数意义:
r:插入库中的模块(替换)。当插入的模块名存在于库中时,更换同名模块。
s:将目标文件索引写入库中,或更新存在的目标文件索引。
v:该选项用于显示执行选项的附加信息。
t:模块表清单显示库。通常只显示模块名。
ar -rsv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
ar -t libpr.a
pr1.o
pr2.o
(4) 链接选项的编译
-L 及-l 参数放在后面.其中,-L 加载库文件路径,-l 指明库文件名称.
gcc -o main main.c -L./ -lpr //生成main
(5)执行目标程序
./main
This is the first lib src!
This is the second src lib!
三、动态库(隐式调用)
(1)设计库代码
pr1.c代码如下:
#include <stdio.h>
int p = 2;
void print(){
printf("%p:%d\n", &p, p);
printf("This is the first dll src!\n");
}
(2)生成动态库 xxx.so
gcc -O -fpic -shared -o xxx.so pr1.c
ls -l *.so
-rwxrwxr-x 1 bill bill 6592 4 月 15 15:19 xxx.so
(3)动态库的隐式调用
main.c代码如下:
int main()
{
print();
return 0;
}
gcc -o main main.c ./xxx.so
./main
0x97b5d4:2
this is the first lib src!
当动态库的位置发生变化时, 程序将无法正常运行; 而动态库取代静态库的好处之一则是通过更新动态库而随时升级库的内容.
参考链接:
http://www.jb51.net/article/37409.htm