在某度上搜索libco全都是源码分析,像我这样的菜鸡使用Makefile时还是有点小挫折的,下面我们一起体验一下书写编译第一个ibco程序。
下载源代码
github:https://github.com/WbtLm/libco
打开上述网址,点击如下图所示的绿色按钮,选择Download Zip:
将zip解压,(我将里面所有文件都拷贝到了/home/用户名/libco/文件夹下)
书写代码
我们书写第一个libco的源代码“new.cpp”:
我是参考example_echosvr.cpp书写的。头文件直接拷贝就好。
#include "co_routine.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/time.h>
#include <stack>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#ifdef __FreeBSD__
#include <cstring>
#include <sys/types.h>
#include <sys/wait.h>
#endif
#include<iostream>
using namespace std;
static void* A(void *arg) {
printf("1 ");
co_yield_ct(); // 切出到主协程
printf("2 ");
}
static void* B(void *arg) {
using namespace std;
printf("x ");
co_yield_ct(); // 切出到主协程
printf("y ");
}
struct task_t
{
stCoRoutine_t *co;
int fd;
};
typedef struct task_t task_t;
int main(void) {
stCoRoutine_t *coa,*cob;
taska->fd=-1;
taskb->fd=-1;
co_create(&coa,NULL,A,NULL);//**stCoRoutine_t, *attr(shareMem),pfn,*arg
co_create(&cob,NULL,B,NULL);
co_resume(coa);
co_resume(cob);
co_resume(coa);
co_resume(cob);
printf("\n");
}
配置Makefile
初始Makefile文件是没有我们当前的源文件“new.cpp”的命令的。我们将new.cpp放入libco根目录下,新建一个终端,使用vim打开Makefile文件
vim Makefile
找到PROGS的定义:
这一行第一个colib是必须的(别问我为什么),然后后面是代码自带的example,的可以删掉或者用#注释掉。然后把new写到一行的后面。效果如图
然后往下翻,找到这么一串代码:
这些是自带的example们,可以删掉或注释掉。
后面加上两行:
new:new.o
$(BUILDEXE) #注意,这一行第一个字符必须是<tab>键
#此处加一个回车
效果是这样的:
改完后保存退出。vim下按ESC键,然后输入英文冒号:wq回车
编译运行
第一次编译只需要输入make即可。然后我们就能看到一些提示信息
有warning可以忽略,只要没有error就好。
然后输入./new就可以运行:
效果跟预期相同。我们用协程完成了不同函数轮转运行。
注意
我们第二次make时会产生乱码各种错误,这是为什么呢?
我们在Makefile里面写的new文件会先编译new(可执行文件),如果new不存在的话寻找并编译new.cpp文件。我们在make之前要先把之前的new(可执行文件)删除掉才行(好吧,蒟蒻不知道怎么更优美地解决这个问题)。
第二次编译运行:
rm new
make
./new
我们接下来就可以愉快地使用libco写代码了。