Linux平台下muduo网络库源码编译安装与测试,包含boost库的安装与测试!!!!

最近在学习muduo网络库,先来记录一下如何在Linux平台下编译安装以及测试muduo网络库源码。

获取源码

muduo库源码github仓库地址:
https://github.com/chenshuo/muduo
在linux系统下,输入 git clone https://github.com/chenshuo/muduo.git 进行安装。

安装boost库

这里我参考了大秦坑王的文章C++网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装进行安装。

  • 首先安装文章中百度网盘的链接,下载了boost源码包。

  • 在Linux系统上进行安装(我使用xftp进行上传),然后通过以下命令解压:
    tar -zxvf boost_1_69_0.tar.gz
    查看内容ll;
    在这里插入图片描述

  • 运行./bootstrap.sh

  • 会生成一个b2
    在这里插入图片描述
    运行./b2;
    注意:

  • 要先安装g++,建议版本在4.6以上。

  • 如果这里报错,需要安装python-dev依赖,sudo yum install python-devel

  • 编译完成会显示:The Boost C++ Libraries were successfully built!

  • boost库头文件和lib库文件安装在默认的Linux系统头文件和库文件的搜索路径下,这里需要如下两步:

  1. 头文件路径:将头文件路径/boost_1_69_0添加到默认的头文件搜索路径中,通常默认的头文件搜索路径是 /usr/include。通过执行以下命令将头文件路径添加到默认的头文件搜索路径中(需要管理员权限):
    sudo cp -r boost_1_69_0 /usr/include 注意:这里参数1,需要为自己的路径,相对路径或者绝对路径都可以);
  2. 库文件路径:将库文件路径/boost_1_69_0/stage/lib添加到默认的库文件搜索路径中,通常默认的库文件搜索路径是 /usr/lib 或 /usr/lib64。可以通过执行以下命令将库文件路径添加到默认的库文件搜索路径中(需要管理员权限):
    sudo cp boost_1_69_0/stage/lib/* /usr/lib同样:这里参数1,需要为自己的路径,相对路径或者绝对路径都可以);
  • 然后执行 ./b2 install注意:在root用户下执行);
    显示 ...updated 14831 targets...表示成功!!!

测试验证boost

使用参考文章里面的例子,创建一个 test.cpp 文件,输入以下代码:

#include <iostream>
#include <boost/bind.hpp>
#include <string>
using namespace std;class Hello
{
public:void say(string name) { cout << name << " say: hello world!" << endl; }
};int main()
{Hello h;auto func = boost::bind(&Hello::say, &h, "zhang san");func();return 0;
}
  • 然后通过输入 g++ test.cpp -o test -std=c++11编译形成test;
    在这里插入图片描述
  • 运行./test
    在这里插入图片描述
    至此,Linux下的boost库安装成功!

回到muduo

  • muduo库源码编译会编译很多unit_test测试用例代码,编译耗时长,我们可以在CMakeLists.txt文件做如下修改:
    在这里插入图片描述
  • 注释掉框里的那一行,然后继续。
  • 安装cmake(muduo是用cmake来构建的,需要先安装cmake)
    yum install cmake
  • 执行build.sh ./build.sh
    注意:这里如果报错:
    在这里插入图片描述
    只需要在项目的根目录的CMakeLists.txt文件中,将-Werror选项注释即可,此时警告不会被视为错误(该错误是由于编译时启用了 -Werror=conversion 选项,该选项会将警告视为错误。在这里,编译器提示可能由于从 long unsigned int 到 int 的转换而导致值的变化。)。
    在这里插入图片描述
  • 再次./build.sh,显示100%完成即可。
  • 再输入./build.sh install命令进行muduo库安装
    在这里插入图片描述
    注意:这个./build.sh install实际上把muduo的头文件和lib库文件放到了muduo-master同级目录下的build目录下的release-install-cpp11文件夹下面了,并没有把它们拷贝到系统路径下,导致我们每次编译程序都需要指定muduo库的头文件和库文件路径,很麻烦,所以我们选择直接把inlcude(头文件)和lib(库文件)目录下的文件拷贝到系统目录下:
    在这里插入图片描述
  • 执行mv muduo/ /usr/include/
    在这里插入图片描述
  • 回到lib目录下,执行mv * /usr/local/lib/
    拷贝完成以后使用muduo库编写C++网络程序,不用在指定头文件和lib库文件路径信息了,因为g++会自动从/usr/include和/usr/local/lib路径下寻找所需要的文件。

测试

这里使用参考文章中的代码,创建 test.cpp 文件,输入以下代码:

#include <muduo/net/TcpServer.h>
#include <muduo/base/Logging.h>
#include <boost/bind.hpp>
#include <muduo/net/EventLoop.h>// 使用muduo开发回显服务器
class EchoServer
{public:EchoServer(muduo::net::EventLoop* loop,const muduo::net::InetAddress& listenAddr);void start(); private:void onConnection(const muduo::net::TcpConnectionPtr& conn);void onMessage(const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer* buf,muduo::Timestamp time);muduo::net::TcpServer server_;
};EchoServer::EchoServer(muduo::net::EventLoop* loop,const muduo::net::InetAddress& listenAddr): server_(loop, listenAddr, "EchoServer")
{server_.setConnectionCallback(boost::bind(&EchoServer::onConnection, this, _1));server_.setMessageCallback(boost::bind(&EchoServer::onMessage, this, _1, _2, _3));
}void EchoServer::start()
{server_.start();
}void EchoServer::onConnection(const muduo::net::TcpConnectionPtr& conn)
{LOG_INFO << "EchoServer - " << conn->peerAddress().toIpPort() << " -> "<< conn->localAddress().toIpPort() << " is "<< (conn->connected() ? "UP" : "DOWN");
}void EchoServer::onMessage(const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer* buf,muduo::Timestamp time)
{// 接收到所有的消息,然后回显muduo::string msg(buf->retrieveAllAsString());LOG_INFO << conn->name() << " echo " << msg.size() << " bytes, "<< "data received at " << time.toString();conn->send(msg);
}int main()
{LOG_INFO << "pid = " << getpid();muduo::net::EventLoop loop;muduo::net::InetAddress listenAddr(8888);EchoServer server(&loop, listenAddr);server.start();loop.loop();
}
  • 保存退出以后,编译运行
    g++ test.cpp -lmuduo_net -lmuduo_base -lpthread -std=c++11
  • 生成./a.out,运行./a.out
    在这里插入图片描述
    监听成功,再打开一个终端,通过以下命令,用netcat命令模拟客户端连接echo服务器进行功能测试:
    echo "hello world" | nc localhost 8888
    在这里插入图片描述
  • 说明客户端数据回显正确,看看服务器接日志信息打印如下:
    在这里插入图片描述
    到此,我们的muduo安装成功,再次基础上可以正常进行C++网络程序开发~~
初次学习,记录一下,避免以后还会遇到同样的问题,也希望能够帮助到大家~
希望大佬多多指正哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT防止自研软件被复制的基本操作(二)

参考一 自研软件为了防止被人任意复制传播&#xff0c;需要设置注册使用模式。基本原理&#xff1a;通过计算机的特异性编号&#xff0c;加上自己的编码&#xff0c;使用加密算法算出一个生成码。 一、计算机的特异性编号 硬盘的编号&#xff1a;最后一块硬盘的编号就行&#…

【简单讲解下npm常用命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

JavaScript 中的 Class 类

&#x1f525; 引言 在ECMAScript 2015&#xff08;ES6&#xff09;中&#xff0c;class 关键字被引入&#xff0c;为JavaScript带来了一种更接近传统面向对象语言的语法糖。类是创建对象的模板&#xff0c;它们封装了数据&#xff08;属性&#xff09;和行为&#xff08;方法&…

YOLO自研模块:多尺度轻量化卷积模块

目录 一、原理 二、代码 三、配置文件 一、原理 不同大小的卷积核,提取目标特征的特征尺度不同,所以通过使用不同大小卷积核的卷积来提取特征就可以保证获取到目标的多尺度特征。 借鉴YOLOv8中,将通道数进行划分的操作,在卷积的输入过程中为了减小参数量,将输入通道数…

计算机的翻译(编译和链接)过程

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C语言基本概念 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;1.翻译环境和运行环境&#xff1…

生信小知识 | 如何快速确定一个物种某一个基因家族全部基因数目

公众号&#xff1a;生信漫谈&#xff0c;获取最新科研信息&#xff01; 生信小知识 | 如何快速确定一个物种某一个基因家族全部基因数目https://mp.weixin.qq.com/s?__bizMzkwNjQyNTUwMw&mid2247486827&idx1&sn9fea85f8d28af3e02570235936a1f535&chksmc0e9e8…

io流,字节流概述

io流概述 io流&#xff1a;输入输出流读写数据的 i 指Input&#xff0c;称为输入流:负责把数据读到内存中去 o指Output&#xff0c;称为输出流:负责写数据出去 io流的分类 按流的方向分为: 输入流和输出流。 按流中数据的最小单位&#xff0c; 分为:字节流&#xff08;适合操作…

展开说说:Android Fragment完全解析-卷三

本文章分析了Fragment的管理器FragmentManager、事务FragmentTransaction 、以及完整的声明周期和动态加载Fragment的原理解析。 1、Fragment管理器 FragmentManager 类负责在应用的 fragment 上执行一些操作&#xff0c;如添加、移除或替换操作&#xff0c;以及将操作添加到…

c#学习基础2

四、复杂数据类型--结构体 1.基本概念 、2.基本语法 结构体一般写在namespace语句块中&#xff1b; 结构体关键字 struct 3.实例 4.结构体的使用 5.访问修饰符 6.结构体的构造函数 7.总结 五、排序初探 1&#xff09;冒泡排序 1.排序的基本概念 2.冒泡排序的基本原理 两…

西班牙语语法名词的复数形式,柯桥西班牙语培训

&#xff08;2&#xff09;后面加-es • 以辅音结尾的名词。例如&#xff1a; el seor - los seores 先生 la ciudad - las ciudades 城市 • 以-y 结尾的名词。例如&#xff1a; el rey - los reyes 国王 la ley - las leyes 法律 • 以-z 结尾的名词&#xff0c;将词尾…

【Linux】学习笔记

文章目录 [toc]第一章&#xff1a;基础篇01|课程介绍02|内容综述03|什么是Linux04|Linux的内核版本及常见发行版内核版本发行版本Red Hat Enterprise LinuxFedoraCentOSDebianUbuntu 05|安装VirtualBox虚拟机VirtualBox下载url 06|在虚拟机中安装Linux系统Linux安装镜像下载 07…

数据库(MySQL)—— 多表查询

数据库&#xff08;MySQL&#xff09;—— 多表查询 多表关系一对多多对多一对一多表查询概述数据准备查询形式笛卡尔积 分类连接查询内连接外连接左外连接右外连接 自连接联合查询 今天我们来进入MySQL中一个非常重要的部分&#xff1a;多表查询&#xff1a; 多表关系 多表关…

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

主机win10,VMware 装了ubuntu,ubuntu传文件到主机

亲测可用&#xff0c;1分钟搞定&#xff0c;不能用你打死我 使用 FileZilla 工具互传 FileZilla是一款免费的工具&#xff0c;是基于 FTP 协议进行文件互传的&#xff0c;在传输过程中我们的ubuntu是作为服务器&#xff0c; FileZilla 工具则是作为客户端。 1 ubuntu安装 FTP…

【力扣】203、环形链表 II

142. 环形链表 II 要解决这道题&#xff0c;首先需要对问题进行拆解&#xff1a; 确定链表是否存在环确定环的入口点 如何判断是否存在环呢&#xff1f;这个比较容易想到&#xff0c;使用快慢指针即可判断链表是否存在环。我们定义两个指针&#xff1a; ListNode slow head…

容器组_配置初始化容器

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

SSM整合-前后端分离-项目环境搭建 (上)

整合SSM 项目基础环境搭建项目介绍创建项目项目全局配置web.xmlSpringMVC配置配置Spring和MyBatis, 并完成整合创建表, 使用逆向工程生成Bean, XxxMapper和XxxMapper.xml注意事项和细节说明 实现功能01-搭建Vue前端工程需求分析/图解代码实现搭建Vue前端工程vue3项目目录结构梳…

服务网关GateWay原理

文章目录 自动装配核心类GatewayAutoConfigurationDispatcherHandler请求处理阶段apply方法httpHandler#handle方法WebHandler#handle方法DispatchHanlder#handle方法第一步 getHandler获取请求映射第二步 invokeHandler 请求适配第三步 handleResult请求处理总结 上一篇博文我…

Gitea 上传用户签名

在 Gitea 的用户管理部分&#xff0c;有一个 SSH 和 GPG 的选项。 单击这个选项&#xff0c;可以在选项上添加 Key。 Key 的来源 如是 Windows 的用户&#xff0c;可以选择 Kleopatra 这个软件。 通过这个软件生成的 Key 的界面中有一个导出功能。 单击这个导出&#xff0c;…

OpenWRT有线桥接部署教程

前言 之前咱们讲到OpenWRT部署WAN实现PPPoE拨号上网和自动获取IP模式上网的办法&#xff1a; OpenWRT设置PPPoE拨号教程 OpenWRT设置自动获取IP&#xff0c;作为二级路由器 这一次&#xff0c;咱们尝试用OpenWRT有线桥接上一级路由器的教程。 可能有小伙伴敏锐地发现了&am…