静态库、动态库的制作以及调用

来源:互联网 发布:php高级编程 pdf 网盘 编辑:程序博客网 时间:2024/06/02 06:40
      库:本质上说库是一种可执行代码的二进制形式,Linux系统支持动态库(共享库)和静态库。Linux下库一般放在b或/usrb。头文件放在/usr/include中。
      
       动态库:以“.so”为后缀libxxx.so。因为编译的时候并没有被编译进目标代码中,程序执行到相关函数
时才调用函数库里的相应函数,所以文件大小不大,容易升级。
      
       静态库:整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会称为它的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。
     
下面我们在Linux系统来分别制作动态库和静态库:
 
 首先写好两个源程序(.c)和对应的头文件:
[yangni@yangni dir1]$ ls
fun1.c  fun1.h   fun2.c  fun2.h
 
然后分别产生fun1.c 和fun2.c目标文件(.o):
[yangni@yangni dir1]$gcc -c fun1.c
[yangni@yangni dir1]$ gcc -c fun2.c
 
[yangni@yangni dir1]$ls
fun1.c  fun1.h  fun1.o  fun2.c  fun2.h  fun2.o
 
将所有目标文件静态链接(.o)生成静态库文件(.a):
[yangni@yangni dir1]$ ar -rcs libname.a fun1.o fun2.o
 
生成动态库:
 
[yangni@yangni dir1]$ gcc -shared -fpic -o libname.so *.c
[yangni@yangni dir1]$ ls
fun1.c  fun1.h  fun1.o  fun2.c  fun2.h  fun2.o  libname.a  libname.so
 
 
 
 
编写main.c运行 但发现错误:
[yangni@yangni ku]$ gcc -I./dir1 main.c -o test  (dir1为头文件所在路径)
 
[yangni@yangni dir1]$ gcc main.c
/tmp/ccLfO4fm.o: In function `main':
main.c:(.text+0x5): undefined reference to `fun1'
main.c:(.text+0xa): undefined reference to `fun2'
 
因为main.c只包含fun1  fun2函数体,fun.c被整合到库中了,所以需要链接库:
 
[yangni@yangni dir1]$ gcc main.c -o app .bname.a   (app重命名a.out)
[yangni@yangni dir1]$ ls 
 
 
依赖动态库编译:
直接编译会显示错误,需将.so文件拷贝到Linux下存放库文件的文件夹:
 
[yangni@yangni dir2]$sudo cp libname.so b64
或者通过修改环境变量将当前路径设置标准动态库:
[yangni@yangni dir2]$export LD_LIBRARY_PATH=’当前路径’  
 
然后再编译:
[yangni@yangni dir2]$ gcc -I./dir2 main.c -o app -L./dir2 -lname       
[yangni@yangni dir2]$ ls
app     fun1.h  fun2.c  fun2.o     libname.so
fun1.c  fun1.o  fun2.h  libname.a  main.c
 
[yangni@yangni dir2]$ ./app
hello world!i can't believe it!
 
 
调用静态库编译:
[yangni@yangni dir2]$ gcc  -static  -I./dir2 main.c -o app -L./dir2 –lname  
can not find –lc
 
注:这时会提示找不到-lc
因为我们系统没有安装与-lc相应静态库,所以需要用yum install glibc-static安装
[yangni@yangni dir2]$ yum install glibc-static
再一次编译:
yangni@yangni ku]$ gcc -static main.c -I./dir2 -o app -L./dir2 -lname
[yangni@yangni ku]$ ls
app  dir1  dir2  main.c
[yangni@yangni ku]$ ./app
hello world!i can't believe it!


1 0
原创粉丝点击