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上调试通过
写的不好,见谅
阅读(5170) | 评论(1) | 转发(0) |