Linux中so文件为共享库,与windows下dll类似,不过实现要简单。

so可以供多个进程使用,不同进程调用同一个so文件,所使用so文件不同。

so文件源程序不需要main函数,有也不会被执行。

下面通过一个简单例子,来学习.so文件的制作跟使用(前提已经配置好环境)、

主要了解学习用C语言编译一个动态链接库,如何使用这个库

1、通过简单max函数,生成一个libmax.so链接库

[cpp] view plaincopy
  1. /*
  2. * max.c
  3. *
  4. *  Created on: 2016年7月24日
  5. *      Author: Andy_Cong
  6. */
  7. /*生成libmax.so链接库*/
  8. /*
  9. * # -shared 为链接库  让编译器知道是要编译一个共享库
  10. * # -fPIC(Position Independent Code)   编译生成代码与位置无关
  11. */
  12. int max(int a,int b)
  13. {
  14. return a>b?a:b;
  15. }
  16. /*
  17. * gcc -Wall -g  -fPIC -c max.c -o max.o
  18. * gcc -shared max.o -o libmax.so
  19. * -g -Wall 供调试使用,不是必须的
  20. */

编译结果:生成libmax.so

2、使用链接库,需要包含头文件(很正常,我们平时使用C库函数也需要包含相关头文件)

max.h头文件如下

[cpp] view plaincopy
  1. /*
  2. * max.h
  3. *
  4. *  Created on: 2016年7月24日
  5. *      Author: Andy_Cong
  6. */
  7. #ifndef MAX_H_
  8. #define MAX_H_
  9. int max(int a,int b);
  10. #endif /* MAX_H_ */

测试函数main.c如下

[cpp] view plaincopy
  1. /*
  2. * main.c
  3. *
  4. *  Created on: 2016年7月24日
  5. *      Author: Andy_Cong
  6. */
  7. #include<stdio.h>
  8. #include"max.h"
  9. int main(void)
  10. {
  11. printf("call max function results is: %d\n",max(1,1));
  12. return 0;
  13. }
  14. /* 使用libmax.so库
  15. * gcc -o  main main.c -L. -lmax
  16. *
  17. *-L.: 在当前路径下寻找.so文件
  18. *-lmax: 要链接这个libmax.so文件
  19. *
  20. * */

运行结果:生成可执行程序main(成功了)

3、使用C++编译使用C语言提供的链接库, 编译链接出错(下面只是简单将main.c 改为main.cpp)

怎么办呢??

libmax这个库仅适合C使用,C++并不适合,如果想编译一个可以供C++使用。那么头文件(max.h)就需要改变,

需要额外增加一句:extern "C"

max.h(修改如下)

[cpp] view plaincopy
  1. /*
  2. * max.h
  3. *
  4. *  Created on: 2016年7月24日
  5. *      Author: Andy_Cong
  6. */
  7. #ifndef MAX_H_
  8. #define MAX_H_
  9. extern "C"   // 这句话可理解为,告诉编译器,这个动态库(.so)是用C语言写的,
  10. // 需要用C语言链接方式来链接这个库,这样就可以g++来编译了。
  11. int max(int a,int b);
  12. #endif /* MAX_H_ */

运行结果

这样就解决了。

4、但是这样有一个问题,难道每次编译都要改来改去,有没有同时适合C/C链接库的方法呢?

答案是有的,只需要改动头文件即可,使用条件编译

C++有一个宏:__cpluscplus   当用g++编译的时候,就可以识别这个宏

[cpp] view plaincopy
  1. /*
  2. * max.h
  3. *
  4. *  Created on: 2016年7月24日
  5. *      Author: Andy_Cong
  6. */
  7. /*条件编译*/
  8. #ifndef MAX_H_
  9. #define MAX_H_
  10. #ifndef __cpluscplus
  11. extern "C"  //C++
  12. {
  13. #endif
  14. int max(int a,int b);
  15. #ifndef __cplusplus
  16. }
  17. #endif
  18. #endif /* MAX_H_ */

Linux-(C/C++)动态链接库生成以及使用(libxxx.so)相关推荐

  1. linux gcc 静态 动态链接库

    linux gcc 静态 动态链接库 静态链接库 首先生成依赖函数的目标文件 gcc -c source1.c source2.c; 然后归档目标文件到静态库 ar -rcs libYourID.a ...

  2. bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库

    引言 前面我们讲解了什么是函数库(函数库就是一些事先写好的函数集合),函数库有什么作用(可以打包我们的编写的源代码,供他人使用,同时源码不可见,保护了自己的知识产权)以及函数库有2种提供方式:静态链接 ...

  3. LINUX系统中动态链接库的创建与使用

    大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀 的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不 同,它里面的函数并不是执行程序本身的 ...

  4. linux动态库ppt,LINUX系统中动态链接库创建与使用补充_区块链白皮书代写|市场计划书项目PPT设计_Tbleg...

    区块链白皮书代写 大家都知道,在WINDOWS系统中有很多动态链接库(以.DLL为后缀文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面函数并不是执行程 ...

  5. LINUX系统中动态链接库的创建和使用

    大家都知道,在windows系统中有非常多的动态链接库(以.dll为后缀的文件,dll即dynamic link library).这种动态链接库,和静态函数库不同,他里面的函数并不是执行程式本身的一 ...

  6. 在linux下编写动态链接库的步骤: g++ -lc

    引用自http://blog.csdn.net/lwhsyit/article/details/2828306 类似Windows系统中的动态链接库,Linux中也有相应的共享库用以支持代码的复用.W ...

  7. crt证书linux使用,linux下使用openssl生成https的crt和key证书

    x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...

  8. Linux真随机数的生成

    今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace st ...

  9. linux生成日志文件,linux实现按天生成日志文件并自动清理

    linux实现按天生成日志文件并自动清理 前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理 ...

  10. linux 命令读db文件格式,使用linux的db_load命令生成db数据库

    使用linux的db_load命令生成db数据库 发布时间:2020-07-22 10:17:25 来源:亿速云 阅读:113 作者:清晨 栏目:服务器 不懂使用linux的db_load命令生成db ...

最新文章

  1. mongodb 安装和配置auth验证
  2. 常用git命令思维图
  3. 必须掌握的八个【cmd 命令行】[
  4. CSS3动画属性之Transition
  5. 【转载】关于对方法实例化的相关感悟以及unity的50个技巧
  6. python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)
  7. 【Qt】仿360安全卫士界面(自定义阴影边框类)
  8. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践
  9. Intellij Idea搭建Spark开发环境
  10. [linux]CentOS安装pre-built Nginx
  11. 99%的程序都没有考虑的网络异常
  12. 我的世界服务器组件怎么用,我的世界:两款服务器的组件功能,种树也有学问,种树技巧!...
  13. centos7 安装 卸载docker
  14. NVivo的节点矩阵
  15. 《具体数学》(二)和式
  16. 截图工具-picpick绿色破解版免安装
  17. 洪水攻击程序c语言,洪水攻击原理及代码实现全攻略(附源代码)病毒防范 -电脑资料...
  18. 大型网站技术架构-核心原理与案例分(李智慧 著)第1章-大型网站架构演化
  19. Burpsuite字符偏移修正
  20. 友盟统计-事件跟踪的部署

热门文章

  1. 红包指定分配金额php,php仿微信红包分配算法的实现方法_PHP
  2. fastjson反序列化过滤字段属性_原创干货 | 从RMI入门到fastjson反序列化RCE
  3. 鼠标图标怎么自定义_酷鱼魔鼠——给鼠标添加酷炫的特效
  4. java ldap添加用户名密码_java ldap用户密码md5加密
  5. bootstrap文件不能被识别_如何使用npm安装bootstrap
  6. Java大牛分享的面试知识点
  7. python windows开发_windows 下 python 开发是一种什么样的体验?
  8. vim 显示行号_Vim给文件加行号,这通惊为天人的操作没sei了!文末天书慎点
  9. mysql group by 规则_mysql 的group by 满足的规则要求:
  10. android 天气接口简书,天气API接口说明