静态库、动态库的制作以及调用
来源:互联网 发布: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!
下面我们在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
- 静态库、动态库的制作以及调用
- 库的静态和动态调用以及创建
- 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
- 静态库和动态库的制作
- 静态库与动态库的制作
- 静态库和动态库的制作
- 动静态库的制作与调用
- gcc动态静态库的制作
- Linux下编译动态库,静态库,以及调用
- C调用C++动态库以及静态链接库
- 静态、动态库制作使用
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
- 动态链接库的制作与调用
- 动态链接库的制作与调用
- 静态调用OpenCV库以及生成自己的静态库
- Linux下的动态库与静态库的制作
- 关于静态库以及调用
- IOstream及附属&Cstdio用法
- jasonObject转Map用readValue
- git常用的命令
- Java I/O的工作机制
- mybatis与spring整合
- 静态库、动态库的制作以及调用
- SpatialHadoop2.x源码编译
- Tkinter做弹球游戏
- 51nod-1095 Anigram单词
- 第九周项目3-稀疏矩阵的三元组表示的实现及应用(2)
- 欢迎使用CSDN-markdown编辑器
- 第十周项目3--利用二叉树遍历思想解决问题--判断二叉树相似
- 堆与栈在内存里是怎么分配的?
- 进程进入不了下一function