Linux-(C/C++)动态链接库生成以及使用(libxxx.so)
Linux中so文件为共享库,与windows下dll类似,不过实现要简单。
so可以供多个进程使用,不同进程调用同一个so文件,所使用so文件不同。
so文件源程序不需要main函数,有也不会被执行。
下面通过一个简单例子,来学习.so文件的制作跟使用(前提已经配置好环境)、
主要了解学习用C语言编译一个动态链接库,如何使用这个库
1、通过简单max函数,生成一个libmax.so链接库
- /*
- * max.c
- *
- * Created on: 2016年7月24日
- * Author: Andy_Cong
- */
- /*生成libmax.so链接库*/
- /*
- * # -shared 为链接库 让编译器知道是要编译一个共享库
- * # -fPIC(Position Independent Code) 编译生成代码与位置无关
- */
- int max(int a,int b)
- {
- return a>b?a:b;
- }
- /*
- * gcc -Wall -g -fPIC -c max.c -o max.o
- * gcc -shared max.o -o libmax.so
- * -g -Wall 供调试使用,不是必须的
- */
编译结果:生成libmax.so
2、使用链接库,需要包含头文件(很正常,我们平时使用C库函数也需要包含相关头文件)
max.h头文件如下
- /*
- * max.h
- *
- * Created on: 2016年7月24日
- * Author: Andy_Cong
- */
- #ifndef MAX_H_
- #define MAX_H_
- int max(int a,int b);
- #endif /* MAX_H_ */
测试函数main.c如下
- /*
- * main.c
- *
- * Created on: 2016年7月24日
- * Author: Andy_Cong
- */
- #include<stdio.h>
- #include"max.h"
- int main(void)
- {
- printf("call max function results is: %d\n",max(1,1));
- return 0;
- }
- /* 使用libmax.so库
- * gcc -o main main.c -L. -lmax
- *
- *-L.: 在当前路径下寻找.so文件
- *-lmax: 要链接这个libmax.so文件
- *
- * */
运行结果:生成可执行程序main(成功了)
3、使用C++编译使用C语言提供的链接库, 编译链接出错(下面只是简单将main.c 改为main.cpp)
怎么办呢??
libmax这个库仅适合C使用,C++并不适合,如果想编译一个可以供C++使用。那么头文件(max.h)就需要改变,
需要额外增加一句:extern "C"
max.h(修改如下)
- /*
- * max.h
- *
- * Created on: 2016年7月24日
- * Author: Andy_Cong
- */
- #ifndef MAX_H_
- #define MAX_H_
- extern "C" // 这句话可理解为,告诉编译器,这个动态库(.so)是用C语言写的,
- // 需要用C语言链接方式来链接这个库,这样就可以g++来编译了。
- int max(int a,int b);
- #endif /* MAX_H_ */
运行结果
这样就解决了。
4、但是这样有一个问题,难道每次编译都要改来改去,有没有同时适合C/C链接库的方法呢?
答案是有的,只需要改动头文件即可,使用条件编译
C++有一个宏:__cpluscplus 当用g++编译的时候,就可以识别这个宏
- /*
- * max.h
- *
- * Created on: 2016年7月24日
- * Author: Andy_Cong
- */
- /*条件编译*/
- #ifndef MAX_H_
- #define MAX_H_
- #ifndef __cpluscplus
- extern "C" //C++
- {
- #endif
- int max(int a,int b);
- #ifndef __cplusplus
- }
- #endif
- #endif /* MAX_H_ */
Linux-(C/C++)动态链接库生成以及使用(libxxx.so)相关推荐
- linux gcc 静态 动态链接库
linux gcc 静态 动态链接库 静态链接库 首先生成依赖函数的目标文件 gcc -c source1.c source2.c; 然后归档目标文件到静态库 ar -rcs libYourID.a ...
- bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库
引言 前面我们讲解了什么是函数库(函数库就是一些事先写好的函数集合),函数库有什么作用(可以打包我们的编写的源代码,供他人使用,同时源码不可见,保护了自己的知识产权)以及函数库有2种提供方式:静态链接 ...
- LINUX系统中动态链接库的创建与使用
大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀 的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不 同,它里面的函数并不是执行程序本身的 ...
- linux动态库ppt,LINUX系统中动态链接库创建与使用补充_区块链白皮书代写|市场计划书项目PPT设计_Tbleg...
区块链白皮书代写 大家都知道,在WINDOWS系统中有很多动态链接库(以.DLL为后缀文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面函数并不是执行程 ...
- LINUX系统中动态链接库的创建和使用
大家都知道,在windows系统中有非常多的动态链接库(以.dll为后缀的文件,dll即dynamic link library).这种动态链接库,和静态函数库不同,他里面的函数并不是执行程式本身的一 ...
- 在linux下编写动态链接库的步骤: g++ -lc
引用自http://blog.csdn.net/lwhsyit/article/details/2828306 类似Windows系统中的动态链接库,Linux中也有相应的共享库用以支持代码的复用.W ...
- crt证书linux使用,linux下使用openssl生成https的crt和key证书
x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...
- Linux真随机数的生成
今天看<白帽子讲WEB安全>一书,看到笔者谈到Linux如何实现真随机数生成,感觉非常有用,记录下来 #include<iostream> using namespace st ...
- linux生成日志文件,linux实现按天生成日志文件并自动清理
linux实现按天生成日志文件并自动清理 前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理 ...
- linux 命令读db文件格式,使用linux的db_load命令生成db数据库
使用linux的db_load命令生成db数据库 发布时间:2020-07-22 10:17:25 来源:亿速云 阅读:113 作者:清晨 栏目:服务器 不懂使用linux的db_load命令生成db ...
最新文章
- mongodb 安装和配置auth验证
- 常用git命令思维图
- 必须掌握的八个【cmd 命令行】[
- CSS3动画属性之Transition
- 【转载】关于对方法实例化的相关感悟以及unity的50个技巧
- python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)
- 【Qt】仿360安全卫士界面(自定义阴影边框类)
- 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践
- Intellij Idea搭建Spark开发环境
- [linux]CentOS安装pre-built Nginx
- 99%的程序都没有考虑的网络异常
- 我的世界服务器组件怎么用,我的世界:两款服务器的组件功能,种树也有学问,种树技巧!...
- centos7 安装 卸载docker
- NVivo的节点矩阵
- 《具体数学》(二)和式
- 截图工具-picpick绿色破解版免安装
- 洪水攻击程序c语言,洪水攻击原理及代码实现全攻略(附源代码)病毒防范 -电脑资料...
- 大型网站技术架构-核心原理与案例分(李智慧 著)第1章-大型网站架构演化
- Burpsuite字符偏移修正
- 友盟统计-事件跟踪的部署
热门文章
- 红包指定分配金额php,php仿微信红包分配算法的实现方法_PHP
- fastjson反序列化过滤字段属性_原创干货 | 从RMI入门到fastjson反序列化RCE
- 鼠标图标怎么自定义_酷鱼魔鼠——给鼠标添加酷炫的特效
- java ldap添加用户名密码_java ldap用户密码md5加密
- bootstrap文件不能被识别_如何使用npm安装bootstrap
- Java大牛分享的面试知识点
- python windows开发_windows 下 python 开发是一种什么样的体验?
- vim 显示行号_Vim给文件加行号,这通惊为天人的操作没sei了!文末天书慎点
- mysql group by 规则_mysql 的group by 满足的规则要求:
- android 天气接口简书,天气API接口说明