Chinaunix首页 | 论坛 | 博客
  • 博客访问: 795367
  • 博文数量: 161
  • 博客积分: 10005
  • 博客等级: 中将
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-04 15:08
文章分类

全部博文(161)

文章存档

2014年(1)

2013年(1)

2011年(2)

2010年(18)

2009年(26)

2008年(18)

2007年(66)

2006年(29)

我的朋友

分类: C/C++

2007-06-11 10:52:26

静态库:静态库是包含了目标文件的文件,这些目标文件被称为模块或者成员,是可以重用的预编译代码。为了使用库代码必须在源代码文件中包含适当的头文件。
测试程序:
test.c test.h aa.c
aa.c调用test.c中的foo函数
编译过程:
建立静态库的第一步是把代码编译成目标文件的形式:
gcc -c test.c -o libtest.o
接下来使用工具ar创建一个存档文件:
ar rcs libtest.a libtest.o
这样静态库就生成成功了。
使用静态库
编译:
gcc aa.c -o aa -static -L. -ltest
-static是必须的 -L.指定静态库在当前目录 -ltest指定静态库的名称为libtest.a
共享库:共享库也是包含了目标文件的文件,是可以重用的预编译代码。它要比静态库占用资源少,它可以动态加载,也就是在使用的时候加载,而不用时不加载。运行速度要快于静态库,同时共享库可维护性高,当要升级时只要维护以下共享库就可以而不需要编译程序,而静态库则相反。
编译过程:
首先编译目标文件:
gcc -fPIC -g -c test.c -o libtest.o
然后连接库
gcc -g -shared -W1,-soname,libtest.so -o libtest.so.1.0.0 libtest.o -lc
如果不想把该库做为系统库,则建立连个连接文件
ln -s libtest.so.1.0.0 libtest.so.1
ln -s libtest.so.1.0.0 libtest.so
这个连接文件当使用-ltest时连接到libtest
编译程序:
gcc -g aa.c -o testso -L. -ltest
另一种使用共享库的方法是运行时加载,不是作为编译时加载,而是作为独立的模块使用dl(dynamic loading动态加载)接口显示的加载。dl接口有四个函数分别是(dlfcn.h):
加载共享对象函数dlopen(),原形是void *dlopen(const char *filename,int flag);
filename是加载的共享对象,flag:RTLD_LAZY和RTLD_NOW,一个是加载的对象在调用时解析,一个是在函数dlopen返回前解析。
使用共享对象函数:dlsym,原形:void *dlsym(void *handle,char *symbol);
handle是dlopen返回的句柄,symbol是要使用的共享对象中的函数名称。
检查错误:dlerror,原形const char *dlerror(void);
卸载对象函数:dlclose,原形int dlcolse(void *handle);
handle是dlopen返回的句柄.
注:具体实现参见例子程序。
编译:
gcc -g -Wall dltest.c -o dltest -ldl
 
事例程序源代码:
 
文件: test.tar.gz
大小: 220KB
下载: 下载
阅读(1152) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~