Linux函数库的制作与调用
来源:互联网 发布:兰州历史气象数据查询 编辑:程序博客网 时间:2024/05/18 04:54
[注:本文中的操作在ubuntu-10.04.4上进行。]
静态库与动态库
从本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行,无论静态库还是动态库,都是由.o文件(目标文件)创建的。
- 静态库:静态库的代码在编译过程中已经被载入可执行程序,因此程序体积较大。
- 动态库:不同的应用程序如果调用相同的库,那么在内存里只需要一份该动态库。单独的动态库升级更换不影响其他动态库的正常加载使用,便于升级。
编译多个源文件
1. 新建hello.c:
#include<stdio.h>void hello(){ printf(“Hello world!\n”);}
执行命令gcc –c hello.c,生成目标文件hello.o。
2. 新建hello.h:
#ifndef _HELLO_#define _HELLO_extern voidhello();#endif //_HELLO_
3. 新建main.c:
#include “hello.h”int main(intargc, char **argv){ hello(); return 0;}4. 执行命令gcc –c main生成目标文件main.o
5. 将hello.o和main.o联合编译生成可执行文件hello:gcc –o hello hello.o main.o
注:多文件编译生成可执行文件hello的大小为7184B。
静态库的生成与引用
1. 执行命令gcc –c hello.c,生成目标文件hello.o;
2. 执行命令ar rcs libhello.a hello.o,生成静态库文件libhello.a;
3. 编译时加载静态文件gcc –o hello main.c –static –L. –lhello,生成可执行文件hello。
注:静态库生成的可执行文件hello的大小为594740B,静态库libhello.a的大小为982B,删除静态库后,hello依然可以执行。可以看出加载静态库的可执行文件比较大。
动态库的生成与引用
1. 执行命令gcc –c hello.c,生成目标文件hello.o;
2. 执行命令gcc –shared –fPIC –o libhello.so hello.o,生成动态库libhello.so;
3. 执行命令gcc –o hello main.c –L. –lhello,生成可执行文件hello。
此时运行hello:$./hello将报错:
./hello: errorwhile loading shared libraries: libhello.so: cannot open shared object file: Nosuch file or director
4. 想要执行hello,需要链接到动态库,方法如下:
a) 将libhello.so拷贝到目录/usr/lib中;
b) export LD_LIBRARY_PATH=$(pwd),将libhello.so所在目录(当前目录)加入到LD_LIBRARY_PATH;
c) chcon –t texrel_shlib_t/usr/lib/libhello.so,分享库的绝对路径;[?此命令作用未明]
注:引用动态库的可执行文件hello大小为7128B,动态库libhello.so的大小为6734B,相比编译多个源文件生成hello大小7184B,可以看出加载动态库不会导致可执行文件变大。为确保hello可以成功执行,必须保证应用程序能够链接到动态库,经验证:只要4.a)或者4.b)有一项完成就行。
链接器如何加载动态库
链接器搜索动态库的顺序:
1. elf文件的DT_RPATH段;
2. 环境变量LD_LIBRARY_PATH;
3. /etc/ld.so.cache文件列表;
4. /lib, /usr/lib目录;
只要找到动态库,就将其载入内存。
- Linux函数库的制作与调用
- 函数库的制作
- 静态函数库和动态函数库的制作
- Linux静态函数库的使用和制作/动态…
- Unix/Linux下静态函数库和动态函数库的制作及使用
- linux共享函数库的创建与使用
- python_制作自己的函数库
- 系统函数库与系统调用
- dll的制作与调用
- Linux应用程序学习之制作静态函数库
- linux的函数库管理
- 静态函数库与动态函数库的设计
- 系统调用与标准函数库(上)
- 系统调用与标准函数库(下)
- PHPCMS 系统类库与函数库调用
- Linux:静态函数库(.a)与动态函数库(.so)
- Linux :共享函数库的管理
- Linux里的函数库(Library)
- java环境变量配置的方法及意义所在
- Win8系统网速变慢的解决方案
- 【git】git fetch 与git pull的区别
- c# 反射创建对象
- CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡
- Linux函数库的制作与调用
- php调用JAVA
- Unable to open mouse
- Quartz Core 图层编程
- PHP5.1下安装json扩展
- Today is a special day
- 各种排序的优缺点
- MYSQL常用命令
- 日均互动超50万次 揭秘微信推广运营之道