外部函数
Linux应用程序设计中需要的外部函数主要由 函数库和系统调用来提供。
两者区别
函数库分类
函数库按照链接方式可分为
v静态链接库(直接注入目标程序) v动态链接库(程序启动时加载)
静态链接: 由链接器在链接时将库的内容加入到可执行程序中
动态链接: 连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程
静态链接库 对比 动态函数库
函数库存放位置
Linux应用程序使用的主要函数库均存放于 /lib, /usr/lib目录下,
其中采用*.so.*方式 命名的是动态函数库,
而以*.a方式命令的是 静态函数库
静态链接-特点
v 程序所要用到的库函数代码在链接时全部 被copy到程序中。
v 导致的问题:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么 就会有多份拷贝,这就是对空间的浪费
静态链接的特点是:
优点:
对运行环境的依赖性较小,具有较好的兼容性
缺点:
生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间
库函数有了更新,必须重新编译应用程序
使用静态库-编译选项
1.Linux下进行链接时 默认是链接动态库
2.如果需要使用静态库,需要使用编译选项 -static
例: gcc -static test.c -o test
-lname:
GCC在链接时,默认只会链 接C函数库,而对于其他的函数库,则 需要使用-l选项来显示地指明需要链接。
例:gcc test.c –lmylib -o test
制作静态库
1. gcc –c mylib.c –o mylib.o
2. ar cqs libmylib.a mylib.o
3. 将制作好的libmylib.a 复制到/usr/lib
命名:libname .a
动态链接库-特点
动态链接的特点:
优点:
在需要的时候才会调入对应的资源函数
简化程序的升级;有着较小的程序体积
实现进程之间的资源共享(避免重复拷贝)
缺点:
依赖动态库,不能独立运行
动态库依赖版本问题严重
制作动态库
1. gcc –c mylib.c –o mylib.o
2. gcc -shared -fPIC mylib.o -o libmylib.so
3. 将制作好的libmylib.so 复制到/usr/lib
-fpic 使输出的对象模块是按照可重定位地址方式生成。
-shared 指明产生动态链接库。