快速业务通道

linux下编译自己的库文件实践

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-20
 {

  printf("This is in test_b...n");

  }

  [root@localhost sharelib]# cat test_c.c

  #include <stdio.h>

  #include "so_test.h"

  void test_c()

  {

  printf("This is in test_c...n");

  }

  [root@localhost sharelib]# gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

  [root@localhost sharelib]# ls

  libtest.so so_test.h test_a.c test_b.c test_c.c

  [root@localhost sharelib]# vim test.c

  [root@localhost sharelib]#cat test.c

  #include "so_test.h"

  int main()

  {

  test_a();

  test_b();

  test_c();

  return 0;

  }

  [root@localhost sharelib]# gcc test.c -L. -ltest -o test

  [root@localhost sharelib]# ls

  libtest.so so_test.h test test_a.c test_b.c test.c test_c.c

  [root@localhost sharelib]# ldd test

  linux-gate.so.1 => (0x00c3b000)

  libtest.so => not found

  libc.so.6 => /lib/libc.so.6 (0x00ad9000)

  /lib/ld-linux.so.2 (0x00abc000)

  [root@localhost sharelib]# ./test

  ./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

  [root@localhost sharelib]# ls

  libtest.so so_test.h test test_a.c test_b.c test.c test_c.c

  [root@localhost sharelib]#cp libtest.so /lib/

  [root@localhost sharelib]# ldconfig

  [root@localhost sharelib]# ldd test

  linux-gate.so.1 => (0x007b7000)

  libtest.so => /lib/libtest.so (0x007cf000)

  libc.so.6 => /lib/libc.so.6 (0x00ad9000)

  /lib/ld-linux.so.2 (0x00abc000)

  [root@localhost sharelib]# ./test

  This is in test_a...

  This is in test_b...

  This is in test_c...

  (2)、编译参数解析

  最主要的是GCC命令行的一个选项:

  -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接.相当于一个可执行文件

  -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的.

  -L.:表示要连接的库在当前目录中

  -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

  (3)、调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件.其实编译链接上了共享库不代表执行时可以找到.“-L”什么的对执行没有用,你需要指明共享库的路径.方法有三个:

  a.修改 LD_LIBRARY_PATH,指明共享库的路径.LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径.在终端下使用如下命令:

  [root@localhost sharelib]# export LD_LIBRARY_PATH = .

  [root@localhost sharelib]# export LD_LIBRARY_PATH = your

  lib dir

  export不加也行,:-).

  b.通过/etc/ld.so.conf文件来指定动态库的目录.然后运行ldconfig命令更新搜索共享库的路径.通常这样做就可以解决库无法链接的问题了.此法一劳永逸.

  c.或者把库文件拷贝到/lib下,然后ldconfig,肯定就行了.:-).这个方法有

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号