动态库 静态库链接
gcc –Wall demo.c显示所有警告(包括隐藏的)
库文件:存放函数和变量的仓库 特点:只能使用库里的函数和变量,不能看到其实现
静态库以.a结尾:当使用静态库时,库里的函数和变量是在编译时加载到可执行文件
动态库以.so结尾:当使用动态库时,库里的函数和变量是在运行时加载到可执行文件
可执行文件的大小:静态库>动态库 >内存的使用效率
可执行文件的速度:静态库>动态库 >运行效率
可执行文件的功能升级:静态库<动态库 >功能升级的难易程度
可执行文件的代码部署:静态库>动态库 >代码部署的位置
库文件的存放位置:/lib/user/lib
ar rcs:ar rcs libxxx.a xx1.o xx2.o
参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
root@jsetc-virtual-machine:/test# gcc -c add.c
root@jsetc-virtual-machine:/test# vim add.o
root@jsetc-virtual-machine:/test# ar rcs libadd.a add.o
root@jsetc-virtual-machine:/test# ls
ad.c add add.c add.h add.o da.c kk libadd.a
代码转化二进制
root@jsetc-virtual-machine:/test# gcc -c add.c
root@jsetc-virtual-machine:/test# vim add.o
生成文件
root@jsetc-virtual-machine:/test# vim add.c
root@jsetc-virtual-machine:/test# vim ad.c
root@jsetc-virtual-machine:/test# gcc ad.c add.c -o add
ad.c: In function ‘main’:
ad.c:4:23: warning: implicit declaration of function ‘add’ [-Wimplicit-function-declaration]
printf(“add=%d\n”,add(5,6));
^~~
/tmp/ccEmt0ZW.o: In function main': ad.c:(.text+0x14): undefined reference to
add’
collect2: error: ld returned 1 exit status
root@jsetc-virtual-machine:/test# vim add.h
add.c
ad.c
Add.h(调用函数)
extern int add(int,int);
生成.o文件(二进制)
root@jsetc-virtual-machine:/test# gcc -c add.c
root@jsetc-virtual-machine:/test# vim add.o
文件运行
root@jsetc-virtual-machine:/test# gcc ad.c add.c -o add
root@jsetc-virtual-machine:/test# ./add
add=11
粘贴文件(返回上一级文件在复制到当前文件)
root@jsetc-virtual-machine:/test# cp libadd.a kk
root@jsetc-virtual-machine:/test# cd kk
root@jsetc-virtual-machine:/test/kk# ls
libadd.a
root@jsetc-virtual-machine:/test/kk# cp …/add.h
root@jsetc-virtual-machine:/test/kk# gcc main.c -ladd –L.静态编译(-L当前目录)
root@jsetc-virtual-machine:/test/kk# ls
add.h a.out libadd.a main.c
root@jsetc-virtual-machine:/test/kk# ./a.out
add=11
ladd到哪找文件
如何制作静态库和动态库
静态库
gcc –c源文件
ar rcs 库文件名字 目标文件
gcc 源文件 –l库名 –L库的路径(-L指定的路进去寻找库文件,一般的在-L的后面可以一次用-l指定多个库文件。-L/lib/表示到/lib/目录下找库文件)
(root@jsetc-virtual-machine:/test# gcc -c add.c
root@jsetc-virtual-machine:/test# vim add.o
root@jsetc-virtual-machine:/test# ar rcs libadd.a add.o
root@jsetc-virtual-machine:/test/kk# gcc main.c -ladd –L.
这部要另起一个文件夹)
动态库
gcc –shared –fPIC源文件 –o 库名
root@jsetc-virtual-machine:/test# gcc -shared -fPIC add.c -o libcal.so
root@jsetc-virtual-machine:/test# gcc ad.c ****/****libcal.so -o main (要添加路径)
/tmp/ccf8AvbP.o: In function main': ad.c:(.text+0xf): undefined reference to
add’(少当前路径)
collect2: error: ld returned 1 exit status
root@jsetc-virtual-machine:/test# gcc ad.c **./**libcal.so -o main
gcc 源文件 ./库名 –o可执行文件