博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux动态库基础
阅读量:3985 次
发布时间:2019-05-24

本文共 1156 字,大约阅读时间需要 3 分钟。

转自:http://blog.csdn.net/feixiaoxing/article/details/7203441

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

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

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

[cpp]   
  1. #include "test.h"  
  2.   
  3. int add(int a, int b)  
  4. {  
  5.     return a + b;  
  6. }  
    头文件格式,

[cpp]   
  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文件。

[cpp]   
  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上面稍作改变即可。其他的步骤和
的操作是基本类似的。

[cpp]   
  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  
你可能感兴趣的文章
读书 | 如何像沉迷游戏一样对工作上瘾?
查看>>
如何确保自己的Mac数据安全呢?这里有四个“小秘诀”
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
第一性原理:戳中问题本质的人是怎么思考的?
查看>>
No.147 - LeetCode1108
查看>>
No.148 - LeetCode771
查看>>
No.172 - LeetCode1301
查看>>
No.173 - LeetCode1304
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.177 - LeetCode1310
查看>>
No.178 - LeetCode1311
查看>>
Mac:终端实用快捷键
查看>>
FE:http状态码
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
No.183 - LeetCode1324
查看>>
mac:移动python包路径
查看>>
No.221 - LeetCode[81] Search in Rotated Sorted Array II - 有重复元素单调数组截断后的二分
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>