红联Linux门户
Linux帮助

关于.so 文件的认识

发布时间:2011-09-20 21:58:21来源:红联作者:wengelwang
Hi 这是我在红联Linux网站上发得第一个帖子,着实有些小激动,闲话少说了,言归正传:今天遇到了个菜鸟级的问题, 所以今晚我就把我遇到的困惑及最后的劳动成果与感兴趣的同学分享下吧!

linux下何谓.so文件:1. 用过windows的同学应该都知道 .dll文件吧, 这二者有什么共通之处呢,其实 .so文件就跟.dll文件差不多.//
2.一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码).//
3.Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库.//
4.那么.so文件是怎么用的呢?
for example:(1)动态库的编译
这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
参考2:都是由C或C++编译出来的
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
(2)动态库的链接
这里有个程序源文件 test.c 与动态库 libtest.so 链接生成执行文件 test:
命令:$ gcc test.c -L. -ltest -o test
注:测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
命令:$ ldd test
(注:执行test,可以看到它是如何调用动态库中的函数的。

Ok, That's all !

落笔:Wengel
文章评论

共有 61 条评论

  1. xiaotengyi 于 2011-10-25 11:47:21发表:

    谢谢了,受教了

  2. 好味多 于 2011-10-21 12:07:09发表:

    谢谢分享。

  3. 学者 于 2011-10-17 17:29:28发表:

    学习了,感谢楼主

  4. 空心顽石 于 2011-10-15 12:31:07发表:

    .so.version 是共享函数库文件,靠ld.so这个动态链接程序载入内存中,当程序执行时需要共享函数库时,ld.so就将共享函数库替换程序中的填充代码。
    .a文件是静态函数库,当一个程序做静态链接时,.a文件会被直接复制到执行文件中

  5. vorx 于 2011-10-14 22:09:04发表:

    学习啦,多谢!

  6. wonderall 于 2011-09-26 19:18:06发表:

    动态库只是实现共享库的一种途径,还有其它方法实现共享库。所以说共享库是一个统称,而动态库只是其中一种具体实现

  7. 494426742 于 2011-09-26 16:01:29发表:

    学习

  8. lichengjun2011 于 2011-09-26 16:00:45发表:

    学到了

  9. moshouzb 于 2011-09-25 21:49:53发表:

    学习学习

  10. shu2597758 于 2011-09-22 13:48:20发表:

    分析不错,谢谢楼主分享!

  11. zhangtonghui 于 2011-09-22 11:13:49发表:

    这么犀利 我最近有mentohust上网的相关问题
    我的QQ:173246122
    希望哪位大神能帮忙解决 万分感谢!!!

  12. chengshiding 于 2011-09-21 23:37:21发表:

    动态库术语一般用在windows下,如dll文件就是动态连接库的缩写

    共享库术语一般用在linux下,名字来源好像是编译库的时候有个 --share 选项才称为共享库的吧。

    而且两者的外部功能一样,但是实现和编程方面是有差别的,共享库更胜一筹。

  13. perking100 于 2011-09-21 22:23:50发表:

    分析不错,学习了

  14. 文成墨客 于 2011-09-21 20:55:33发表:

    不明白……

  15. wengelwang 于 2011-09-21 13:55:47发表:

    动态链接库”的意思呢,就是指可由多个程序同时使用的代码和数据的库,但不是可执行文件。
    动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。所以称之为“动态库”。

    有了“动态库”这样的功能,顾名思义,它这样做就是有助于共享数据和资源。所以称是“共享库”。

    summary: 两者无矛盾之处
    That's all.

  16. chengshiding 于 2011-09-21 13:10:30发表:

    请问 动态库和共享库有什么区别?

  17. lianliange85 于 2011-09-21 09:57:49发表:

    沉思。

  18. Growth兆 于 2011-09-21 09:42:12发表:

    感谢wengelwang的分享,本贴加入到论坛顶置的Linux应用贴中

  19. crossbitter 于 2011-09-21 09:04:34发表:

    :0wl;l1

  20. Action 于 2011-09-21 08:46:38发表:

    向楼主学习

  21. yehg01 于 2011-09-20 23:49:58发表:

    感谢楼主!感谢分享!