linux 下c插件开发,Linux C编程:打造一个插件系统
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
运行环境:linux
使用语言:c 或者c++
插件,很多人用过,比如游戏插件,编辑器插件这些,
最著名的就数魔兽大脚插件啦,还有vim插件啦,eclipse插件啦,等等
插件有很多种形式,最常见的就是so文件,在windows上就是各种的dll啦
下面就让我们来了解一下插件式编程吧〜〜
举个例子,你开发了一个游戏,一开始只有三个关卡,分享给了你的小伙伴玩
大家玩得很爽,但很快,游戏通关了,还想玩,这时候怎么办呢?
常规做法就是再加两关,然后编译之后,再发给大家,那么问题就来了
每次想加新关卡,都需要重新编译一次,再下载一次,这个流量嘛,1+1.1+1.2+1.3,每次加个0.1,都够你受的^_^
这个时候嘛,就要引入插件系统了
咱先来写个小程序1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include "game.h" //关于游戏的定义
void ()
{
}
void play()
{
printf("我打,我打,我打打打n");
}
void loadMission()
{
}
int main()
{
initGame();//初始化游戏
int missionNum=loadMission();//读取关卡数
while(1)
{
int missionNo=getchar();//选择关卡
missionNo=missionNo-'0';
if(missionNo>missionNum)
{
printf("没有此关卡!n");
}
play();
}
}
以上就是一个可扩展的游戏架构,够简单吧〜
下面咱就开始设计这个游戏系统的插件吧
在这里,游戏关卡就是我们的插件,一个插件就是一个关卡
先讲讲一个插件的构造吧
首先是这个关卡的描述,比如名称,难度等
其次就是这个关卡游戏过程了
最后,就是玩关卡的人
按照以上描述,咱定几个结构体吧1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37//game.h
#include
//游戏玩家描述
typedef struct _player
{
int life;//玩家生命
}Player;
//游戏关卡描述
typedef struct _mission
{
int level;//关卡难度
char missionName[30];//关卡名称
void (*process)(Player *);//游戏过程
}Mission;
好了,下面就是一个插件的具体内容
```c
//game.c
#include "game.h"
const char name[]="第一关,插件入门";
const int level=1;
void firstMission(Player *p)
{
printf("oh my god ,somebody hurt me!n");
p->life--;
printf("now my life is %dn",p->life);
sleep(1);
}
void gameInfo(Mission *m)
{
m->level=level;
int len=strlen(name);
memcpy(m->missionName,name,len+1);//注意游戏名称不要太长
m->process=firstMission;
}
Ok,以上就是一个关卡的所有东西了,虽然看着简单,不过还是建议动手敲敲^_^
那我们先把这个插件制作出来吧,免得一会忘记了,在终端下执行以下命令:1gcc game.c -fPIC -shared -o firstMission.so -ldl
linux和mac都一样
关卡设计好了,接下来就是怎么样读取我们做好的关卡了
现在实现咱们就loadMission()函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72Mission mission[50];
int loadMission()
{
FILE * fp;
fp = fopen("missionList.txt", "r");//读取关卡列表文件
if (NULL== fp)
{
return 0;
}
int ret=0;
char namelist[50][50];//最多50个插件,每个插件的名字长度最多50
memset(namelist,0,sizeof(namelist));
int count=0;
while(fgets((char *)&namelist[count], 50, fp))
{
ret=strlen(namelist[count]);//计算实际字符串长度
if(namelist[count][ret-1]=='n')
namelist[count][ret-1]='
linux 下c插件开发,Linux C编程:打造一个插件系统相关推荐
- linux下C语言socket网络编程简例
转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...
- Linux下netstat常用,Linux netstat常用命令
1.统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2.统计httpd协议连接数(查看Apache的并发请求数及其TCP连接状态) ps -ef ...
- linux nginx安装php5.5,linux下搭建LNMP(linux+nginx+mysql+php)环境之mysql5.5安装
linux下搭建LNMP(linux+nginx+mysql+php)环境之mysql5.5安装: 首先安装依赖包: yum -y install gcc gcc-c++ autoconf libjp ...
- 解决Linux下pcieport 0000:00:1c.5问题导致的系统根目录/磁盘空间不足
解决Linux下pcieport 0000:00:1c.5问题导致的系统根目录/磁盘空间不足 参考文章: (1)解决Linux下pcieport 0000:00:1c.5问题导致的系统根目录/磁盘空间 ...
- lnmp php 5.4,linux下搭建LNMP(linux+nginx+mysql+php)环境之php5.4安装
安装准备:依赖包下载wget http://ah1.down.chinaz.com/201303/PHP-v5.4.13.tar.gz wget http://soft.7dot.com/soft/l ...
- linux下freerdp编译,linux下安装freerdp连接windows远程桌面的好软件软件
linux下安装freerdp连接windows远程桌面的好软件软件 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 8.90 积分 Linux 下安 ...
- 在linux下nice用法,Linux下nice/renice命令小结
1. nice命令 内核根据进程的nice值决定进程需要多少处理器时间. nice值的取值范围是是: -20到20. 一个具有-20 的 nice 值的进程有很高的优先级. 一个 nice 值为 20 ...
- 利用Python打造一个语音合成系统
利用Python打造一个语音合成系统 背景 一直对语音合成系统比较感兴趣,总想能给自己合成一点内容,比如说合成小说,把我下载的电子书播报给我听等等. 语音合成系统 其实就是一个基于语音合成的工具,但是 ...
- Python调用API打造一个语音合成系统(百度智能云)
Python调用API打造一个语音合成系统(百度智能云) 将文字转换成各种不同味道(大叔型,萝莉音,精神小伙型等)的语音. 申请一个百度智能云账号 使用Python开发一款智能语音合成系统,所以需要P ...
最新文章
- PHP遇到json解决的两个办法,转为数组,直接取值
- 基于SSM实现医院疫情管理系统
- 2020年牛客算法入门课练习赛1【完结】
- 如何确定固定资产入账价值
- swagger报错 java.lang.NumberFormatException: For input string: ““
- python中frozenset( )和set()的用法区别
- 实战:Redis 集群模式(下)
- layui table数据渲染页面+筛选医生+在筛选日期一条龙2
- loop 逻辑门如何使用for_for..loop详解
- markdown公式编辑参考
- 错误: 程序包org.eclipse.swt.graphics不存在/swt.jar下载方法
- lg android tv 手机助手,手机如何投屏到LG电视的教程来了!
- 黑客是怎么攻击网站的(网站渗透入侵全部教程)
- 分布式技术(6) 后端接口设计方案
- 安装RabbitMQ出现Plugin configuration unchanged.问题
- 深入理解IGP-ISIS——ISIS邻居建立过程,影响ISIS邻居建立因素,ISIS报文
- K8s学习(二)——核心组件
- 关于嵌入式面试的一些题
- [JIRA] 从3.6.2旧版升级到新版6.0.8的详细过程
- 信息安全数学基础(一):同余