免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1293 | 回复: 0
打印 上一主题 下一主题

[点击图标 标记为待办记事] linux下链接库的使用(基础入门级别) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-12 15:12 |只看该作者 |倒序浏览
linux下包括两种链接库 动态链接库和静态链接库
这两个链接都涉及到步骤应该都差不多
说说他们的区别吧:
静态链接库是在程序连接的时候将静态库中的数据代码,插入到源程序当中去,这样有个缺点就是程序会过于庞大而在应用动态链接库的程序,链接器需要检查动态链接库,确保其包括生成的可执行文件所需的所有符号,这是编译器并不将代码插入到执行文件当中,而是在程序运行的时候,告诉系统的动态加载程序动态链接库的位置 然后动态的装载与动态的卸载。
来说说这两种程序的应用吧
一。静态链接库
首先写个简单的函数
//print.c file
#include
void print(char *str)
{
    printf("%s\n",str);
}
然后将其编译成.o文件  gcc -c print.c   // 默认生成  print.o文件
然后创建静态库文件     ar rc libmyutil.a print.o     // 注意man  ar
建立库文件索引           ranlib  libmyutil.a
于是就建立了一个简单的  静态链接库
现在就来应用这个静态链接库来创建应用程序了
//main.c file
#include
int main()
{
     char *str="hello, still library";
     print(str);
}
然后编译 :
首先,指定静态链接库的位置(这里有多种方法了 配置环境变量  将静态链接库直接放到lib当中  或者 在运行的时候指定 动态链接库的位置 等等) 现在我们就用三种方法分别编译:
A)采用指定路径
gcc main.c -o main -L/home/fcc/study/cprograme/libutil/ libmyutil.a
这样就生成了一个嵌入了静态链接库文件的可执行程序main  注意这里的-L参数  以及libmyutil.a(这里的文件名字一定要是全写的 )
B)采用将静态链接库放入到 lib目录下
gcc testliba.c -lmyutil -o main
注意这里是将libmyutil.a放入到了lib下 这样再用到libmyutil.a时
可以直接按照标准的静态库文件写了  参照命令
C)采用环境变量
这个可以设置这个lib环境变量LIBRARY_PATH=$LIBRARY_PATH:/home/fcc/study/cprograme/libutil
然后直接
gcc testliba.c -lmyutil -o main
that's all
二 动态链接库
建立动态链接库比静态链接库要稍稍复杂点 可也大同小异
还是上面的两个文件 print.c 和main.c
这时我们就应该将这个print.c编译成独立的与具体的连接地址无关的.o目标文件
gcc -fpic -c [-o print.o] print.c
然后 再开始创建动态链接库文件
gcc -share -o libmyutil.so print.o
这样就创建了一个动态的链接库文件 libmyutil.so
现在再用这个动态库文件来写应用程序
当我们应用这个命令时:
gcc -L/home/fcc/study/cprograme/dlibutil main.c -o main libmyutil.so
出现了如下的错误 :error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
这里主要是动态库的路径不正确,编译时用-L指定的库文件路径,在执行时不
起作用,除非在执行的时候能够指明其具体的路径 这时就需要指明这个环境变量了 :
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/fcc/study/cprograme/dlibutil
注意这个是动态链接库的路径 这样就可以了
或者 用export  LD_LIBRARY_PATH=/home/fcc/study/cprograme/dlibutil
(随便说下 使LD_LIBRARY_PATH失效是  unset LD_LIBRARY_PATH )
这样就可以和静态链接库中的使用方法一致了
在说的就是用点死方法 就是将文件拷到lib当中  直接用标准的动态库调用 来写
这个和静态库一致(这个只是形式上的一致,原理上还是有差别的哦)
还有最后还要说的就是  可以利用ldd来查看所用到的动态链接库  
eg  ldd main
好了 这时第一篇在cu上的技术文章 比较基础 里面的调试都在debian lenny上调试通过
写的不好,见谅
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101577/showart_2050983.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP