linux下的C语言开发(动态库)06

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    动态链接库不是linux独有的特性,在windows下面也存在这样的特性。一般来说,windows下面的动态连接库是以*.dll作为结尾的,而 linux下面的动态连接库是以*.so结尾的。和静态链接库相比,动态连接库可以共享内存资源,这样可以减少内存消耗。另外,动态连接是需要经过操作系 统加载器的帮助才能被普通执行文件发现的,所以动态连接库可以减少链接的次数。有了这个特点,我们就不难发现为什么很多软件的补丁其实都是以动态库发布 的。

    那么,在Linux上动态库是怎么生成的呢?

  1. #include "test.h"  
  2.   
  3. int add(int a, int b)  
  4. {  
  5.     return a + b;  
  6. }  

    头文件格式,

  1. #ifndef  _TEST_H  
  2. #define  _TEST_H  
  3.   
  4. int add(int a, int b);  
  5. #endif  

    此时如果我们想要生成动态库,要做的工作其实非常简单,输入gcc -shared -fPIC -o libtest.so test.c即可。回车后输入ls,我们就可以发现当前目录下面出现了libtest.so文件。

  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. int main()  
  5. {  
  6.     printf("%d\n", add(2, 3));  
  7.     return 1;  
  8. }  

    在上面的代码当中,我们发现使用到了add函数,那么此时如何才能生成一个执行文件呢?也很简单,输入gcc hello.c -o  hello ./libtest.so。然后输入./hello,此时可以验证一下执行文件运行是否正确。在编写静态库的时候,我说过静态库是汇编链接 到执行文件当中的,而动态库不会。朋友们可以做个小实验,删除libtest.so,然后输入./hello。此时大家可以看看系统有没有错误返回?
    这个时候,有的朋友就会问了,那在windows下面dll应该怎么编写呢?其实也不难,只要在test.h上面稍作改变即可。其他的步骤和静态库的操作是基本类似的。

  1. #ifndef  _TEST_H  
  2. #define _TEST_H  
  3.   
  4. #ifdef USR_DLL  
  5. #define DLL_API _declspec(dllexport)  
  6. #else  
  7. #define DLL_API _declspec(dllimport)  
  8. #endif  
  9.   
  10. DLL_API int add(int a, int b);  
  11.   
  12. #endif 
posted @ 2012-01-18 12:18  董雨  阅读(233)  评论(0编辑  收藏  举报