静态库:静态库是包含了目标文件的文件,这些目标文件被称为模块或者成员,是可以重用的预编译代码。为了使用库代码必须在源代码文件中包含适当的头文件。
测试程序:
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 |
下载: |
下载 | |
阅读(1164) | 评论(0) | 转发(0) |