Windows系统和Linux系统中的静态链接库与动态链接库(三)

 本文主要讲述在Linux系统中的静态链接库与动态链接库。

      1.Linux系统中的静态链接库
      (1)创建头文件static_lib.h和源文件static_lib.c,以及应用静态库的主程序文件main.c,代码分别如下(与前面Windwos系统那篇代码基本一样):

    

[cpp]  view plain copy
  1. /*static_lib.h*/  
  2. #ifndef _STATIC_LIB_H  
  3. #define _STATIC_LIB_H  
  4.   
  5. /* 导入或是导出的函数声明 */  
  6. void test_static_lib_method(void);  
  7.   
  8. #endif  

[c-sharp]  view plain copy
  1. /*static_lib.c 静态链接库对外提供的函数*/  
  2. #include <stdio.h>  
  3.   
  4. /*通过该宏定义来将头文件的函数声明为导出函数*/  
  5. #include "static_lib.h"  
  6.   
  7. void test_static_lib_method(void)  
  8.  {  
  9.      printf("test static library method./n");  
  10.  }  

[cpp]  view plain copy
  1. /*main.c*/  
  2.   
  3. #include <stdio.h>  
  4.   
  5. #include "static_lib.h"  
  6.   
  7. int main()  
  8. {  
  9.   
  10.     printf("Hello, World./n");  
  11.   
  12.     /*(1)测试静态态链接库的方法*/  
  13.     test_static_lib_method();  
  14.   
  15.     getchar();  
  16.   
  17.     return 0;  
  18. }  

      (2)输入命令下面的命令,即可生成static_lib.o的文件,其中"#"是系统提示符。
          # gcc -c static_lib.c
      (3)由static_lib.o生成静态库文件,静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。创建命令为cr,其中-c 为创建的意思,-r 为在库中插入模块(替换)。
         # ar -c -r libstatic_lib.a static_lib.o
      (4)在程序中使用静态库,即将静态库中的函数添加到程序中。命令如下,其中 -L 指定静态函数库的位置,L后面还有'.'表示在当前目录下查找静态函数库,-l 则指定了静态函数库的名称,静态函数库的命名方式是lib***.a,那么可以忽略lib和.a。
         # gcc -o main main.c -L. -lstatic_lib
      (5)运行主程序,成功。
         # ./main

      2.Linux系统中的动态链接库

      2.1 创建动态链接库

      (1)创建头文件dynamic_lib.h和源文件dynamic_lib.c, 以及应用动态库的主程序文件main.c

[c-sharp]  view plain copy
  1. /*dynamic_lib.h*/  
  2. void test_dynamic_lib_method(void);  

 

[cpp]  view plain copy
  1. /*dynamic_lib.c*/  
  2. #include <stdio.h>  
  3.   
  4. #include "dynamic_lib.h"  
  5.   
  6. void test_dynamic_lib_method(void)  
  7.  {  
  8.      printf("test dynamic library method./n");  
  9.   
  10.  }  

[cpp]  view plain copy
  1. /*main.c*/  
  2.   
  3. #include <stdio.h>  
  4.   
  5. #include "dynamic_lib.h"   
  6.   
  7. int main()  
  8. {  
  9.   
  10.     printf("Hello, World./n");  
  11.   
  12.     /*(1)测试动态链接库的方法*/  
  13.     test_dynamic_lib_method();  
  14.   
  15.     getchar();  
  16.   
  17.     return 0;  
  18. }  

      (2)生成dynamic_lib.o的文件
           # gcc -c dynamic_lib.c
      (3)创建动态库
           #  gcc -shared -fPCI -o libdynamic_lib.so dynamic_lib.o
      (4)动态库的使用与静态库的方法是一样的,如果使用静态库和使用动态库编译成目标程序时使用的gcc命令完全一样,则优先使用动态库。
           # gcc -o main main.c -L. -ldynamic_lib
      (5)运行主程序,报错,原因没有找到动态库。
           # ./main

      2.2 如何找到生成的动态库有3种方式[1]:
      (1)把动态库拷贝到/usr/lib或是/lib目录下。
      (2)将动态库的路径加入到LD_LIBRARY_PATH环境变量中。例如动态库libdynamic_lib.so 在/root/example/目录下:
      $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/example/
      (3)编辑/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig命令刷新,该命令会重建/etc/ld.so.cache文件,加入的目录下的所有库文件都可见。

      2.3  查看可执行程序依赖的库的命令:
      命令:dd,举例如下
       #ldd ./main
        linux-gate.so.1 =>  (0x0086c000)
        libdynamic_lib.so => /usr/lib/libdynamic_lib.so (0x00de2000)
        libc.so.6 => /lib/libc.so.6 (0x00496000)
        /lib/ld-linux.so.2 (0x00478000)

      2.4 库文件的命名规范
     在Linux系统,库文件一般放在/usr/lib或者/lib牡蛎下,静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称,动态库

的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号。

      2.5 nm命令的用法
nm命令比较简单而且强大,它用来列出一个目标文件中的各种符号,符号的种类很多,其中就包括函数名。用下面的命令可以看到

最后一行就是库的函数名。
#nm libdynamic_lib.so

 

 

[1]http://www.examda.com/linux/fudao/20100903/143434381.html


转自:http://blog.csdn.net/scucj/article/details/6051652

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值