linux库文件的制作
加到动态链接库配置文件/etc/ld.so.conf中.
# pwd >> /etc/ld.so.conf # ldconfig 此时再执行main,即可成功. (3)利用动态链接库管理命令ldconfig,强制其搜索指定目录,并更新缓存文件,便于动态装入. # ldconfig `pwd` 此时再执行main,即可成功. 要注意,第三种方法虽然有效,但效果是暂时的,供程序测试还可以,一旦再度运行ldconfig, 则缓存文件内容可能改变,所需的动态链接库可能不被系统共享了. 无论哪种办法,其实质都是用ldconfig命令把动态库文件 所在路径加入到系统库列表中,(前两种永久,第三种临时) 补充:ldconfig命令的作用(见说明) 七、动态库的显式调用 显式调用的含义是代码出现库文件名,用户需要自己去 打开和管理库文件.其要点为: ⑴把dlfcn.h系统头文件包含进来 ⑵用dlopen函数打开库文件,并指定打开方式 dlopen的的第一个参数为共享库的名称,将会在下面位置查找指定的共享库. ①环境变量LD_LIBRARY_PATH列出的用分号间隔的所有目录. ②文件/etc/ld.so.cache中找到的库的列表,由ldconfig命令刷新. ③目录usr/lib. ④目录/lib. ⑤当前目录. 第二个参数为打开共享库的方式.有两个取值 ①RTLD_NOW:将共享库中的所有函数加载到内存 ②RTLD_LAZY:会推后共享库中的函数的加载操作,直到调用dlsym()时方加载某函数 ⑶用dlerror()函数测试是否打开成功,并进行错误处理; ⑷用dlsym获得函数地址,存放在一个函数指针中 ⑸用获得的函数指针进行函数调用. ⑹程序结束时用dlclose关闭打开的动态库,防止资源泄露. ⑺用ldconfig工具把动态库的路径加到系统库列表中 1、编写测试文件 //main.c 测试动态库显式调用的程序 #include //用于动态库管理的系统头文件 #include "myalib.h" //要把函数的头文件包含进来,否则编译时会报错 int main(int argc,char* argv[]) { //声明对应的函数的函数指针 void (*pTest)(); //加载动态库 void *pdlHandle = dlopen("libtest.so", RTLD_LAZY); //错误处理 if(pdlHandle == NULL ) { printf("Failed load libraryn"); return -1; } char* pszErr = dlerror(); if(pszErr != NULL) { printf("%sn", pszErr); return -1; }
//获取函数的地址 pTest = dlsym(pdlHandle, "test"); pszErr = dlerror(); if(pszErr != NULL) { printf("%sn", pszErr); dlclose(pdlHandle); return -1; } //实现函数调用 (*pTest)(); //程序结束时关闭动态库 dlclose(pdlHandle); return 0; } 2、编译测试文件 使用-ldl选项指明生成的对象模块需要使用共享库 gcc -o main -ldl main.c 执行完后就生成了一个main文件 3、执行测试程序 执行 ./main 输出 test 说明成功. 六、使用动态库时应注意的其他问题 1、无论是动态库的显式调用还是隐式调用,都需要用 ldconfig工具将动态库的路径加到系统库列表中,否则运行时会出错. 2、可以用ldd命令检查程序都使用到哪些共享库 ldd命令行用法如下: ldd [--version] [-v|--verbose] [-d|--data-relocs] [-r|--function-relocs] [--help] FILE... 各选项说明如下: (1) --version : 此选项用于打印出ldd的版本号. (2) -v 或 --verbose : 此选项指示ldd输出关于所依赖的动态链接库的尽可能详细的信息. (3) -d |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |