Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101207
  • 博文数量: 27
  • 博客积分: 1132
  • 博客等级: 少尉
  • 技术积分: 278
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-22 13:56
文章分类

全部博文(27)

文章存档

2011年(1)

2010年(18)

2009年(8)

分类: LINUX

2009-09-12 15:12:41

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上调试通过
写的不好,见谅
阅读(5159) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

totola1472016-03-04 13:02:55

然后 再开始创建动态链接库文件
gcc -share -o libmyutil.so print.o

这里应该是  shared