红联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. Changlobx 于 2014-10-30 10:49:02发表:

    很高兴认识大家,希望一起学习,一起提高,资源不错

  2. nicole810909 于 2014-08-04 16:28:34发表:

    学习中

  3. hyh717 于 2014-07-31 15:22:26发表:

    这个可以看看

  4. couhal 于 2013-07-13 12:11:25发表:

    任务飘过

  5. gzm 于 2013-07-12 17:35:48发表:

    1# wengelwang


    3q

  6. d.x 于 2013-03-31 11:42:57发表:

    分析不错,学习了

  7. gky2009514 于 2012-12-07 13:02:45发表:

    新手完成任务,求下书籍~

  8. lndev 于 2012-12-03 22:03:08发表:

    初次学习,谢谢楼主

  9. q815188 于 2012-12-01 23:40:53发表:

    辛苦了.O(∩_∩)O谢谢

  10. 钢蛋儿007 于 2012-10-28 23:10:45发表:

    感谢楼主

  11. linux郝鑫 于 2012-10-11 17:13:33发表:

    为什么,想下载没有现金啊!!!

  12. hlhlinux 于 2012-10-05 00:15:58发表:

    不太懂

  13. mhx20251005 于 2012-10-04 15:37:51发表:

    thanking for sharing.good

  14. flybackl 于 2012-10-03 12:19:47发表:

    对的 没错 解释的很好 不过我还没掌握。

  15. 伊丝宝贝 于 2012-10-03 04:56:29发表:

    我看下,虽然学过

  16. tusizi 于 2012-10-01 03:49:47发表:

    写的很好很好

  17. 史栋朝 于 2012-07-24 17:47:32发表:

    :0wl;l1

  18. woaimengyou 于 2012-06-16 11:41:34发表:

    good!

  19. pc_Samba 于 2012-06-15 15:43:16发表:

    学习了。。:0wmjh(1

  20. 千里楼 于 2012-06-14 22:51:39发表:

    多谢,受教了

  21. danboat 于 2012-06-14 22:18:23发表:

    很不错!

  22. liuyanqiu0807 于 2012-06-14 15:11:47发表:

    不错学习一下

  23. linuxtro 于 2012-05-31 11:55:09发表:

    受教了,。O(∩_∩)O谢谢

  24. chunhuiever 于 2012-05-14 10:02:41发表:

    貌似不懂。。。

  25. likeLx 于 2012-05-09 15:31:55发表:

    太深奥了!代码太纠结了!(6)m:b

  26. circletiger 于 2012-04-29 20:59:31发表:

    学习了一下。

  27. a7758198 于 2012-04-28 17:03:10发表:

    真正到菜鸟路过,学习中

  28. kaitai502 于 2012-04-19 03:38:26发表:

    感谢楼主!感谢分享!

  29. 820831583@qq.co 于 2012-04-11 13:11:58发表:

    不错

  30. 云飞1992 于 2012-04-10 19:57:57发表:

    学习。。。

  31. circletiger 于 2012-04-02 20:10:44发表:

    又学习了新知识。

  32. zlonly 于 2012-02-25 20:40:03发表:

    哦,看来windows用久了也还有好处

  33. woaimengyou 于 2012-02-24 20:17:41发表:

    学习

  34. circletiger 于 2012-02-24 14:22:13发表:

    感谢楼主!感谢分享!

  35. 墨lgq 于 2012-02-23 18:35:29发表:

    了解了{:2_104:}

  36. xiehuailian 于 2012-02-03 13:28:02发表:

    好学习了

  37. haiwawa 于 2011-12-16 16:22:46发表:

    linux下的动态库,学习下

  38. 雾月O秋水 于 2011-12-12 18:16:53发表:

    最近学习对.so 文件的调用,觉得动态库的铁点就在于能不断的更新,对于更新后运行比较麻烦的问题可以制作makefile文件,很有用的哦,具体的可以参见http://www.linuxdiyf.com/bbs/thread-234981-1-1.html

  39. yangjp777 于 2011-11-28 11:56:16发表:

    很给力,如果要切身体会的话,还是要test yourself。谢谢

  40. wuxingang5 于 2011-11-26 19:30:45发表:

    :0)1学习里