【Linux】Ubuntu中muduo库的编译环境安装

devtools/2024/11/14 8:55:16/

Muduo is a multithreaded C++ network library based on the reactor pattern.

        muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。

        muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码,TcpServer源码,还有很多muduo库应用的示例代码等,学习一下作者优秀的C++多线程网络编程设计思想。

        这篇文章主要讲Linux平台下muduo网络库的源码编译安装,用来开发网络高并发程序。

【注意】:muduo库是基于boost开发的,所以需要先在Linux平台上安装boost库

boost源码包下载链接:https://www.boost.org/

1.下载完成后,先把Linux系统下的boost源码包boost_1_69_0.tar.gz拷贝到某一指定路径下,然后解压:

tar -zxvf boost_1_69_0.tar.gz 

2.进入解压好的文件夹中,用ls命令查看:

lsboost            boostcpp.jam  boost.png      bootstrap.sh  index.htm   INSTALL  libs             more     status
boost-build.jam  boost.css     bootstrap.bat  doc           index.html  Jamroot  LICENSE_1_0.txt  rst.css  tools

3.运行bootstrap.sh工程编译构建程序,需要等待一会儿,查看目录:

./boostrap.sh

4.源码根目录下生成了b2程序,运行b2程序如下(boost源码比较大,这里编译需要花费一些时间):

【注意】:如果Linux系统没有安装g++编译器,需要先安装g++,建议g++4.6版本以上,能比较好的支持C++新标准,可以通过命令 g++ --version 查看g++版本号。

./b2

编译完成后,会有如下打印:
The Boost C++ Libraries were successfully built!

         最后,再把上面的boost库头文件和lib库文件安装在默认的Linux系统头文件和库文件的搜索路径下,运行下面命令(因为要给/usr目录下拷贝文件,需要先进入root用户):

sudo ./b2 install

        安装完成后,最后会有如下信息打印出来:

 测试一下是否安装成功:

#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, "jyx");func();return 0;
}

 

         安装好了boost库的源码之后,我们现在开始安装muduo网络库:

1.拷贝muduo的源码压缩包muduo-master.zip到Linux系统下,

 

jyx@ubuntu:~/boost$ ls
boost_1_86_0  boost_1_86_0.tar.gz  muduo-master.zip
jyx@ubuntu:~/boost$ unzip muduo-master.zip 

2.解压完成后,进入muduo库的解压目录里面

 注意,muduo库源码编译会编译很多unit_test测试用例代码,编译耗时长,我们也用不到,vim编辑上面源码目录里面的CMakeLists.txt文件,如下修改:

 保存并退出,继续下面的步骤。

3.看到有一个build.sh源码编译构建程序,运行该程序(注意:muduo是用cmake来构建的,需要先安装cmake,ubuntu下直接sudo apt-get install cmake就可以,redhat或者centos可以从yum仓库直接安装):

        拿ubuntu举例,如果没有安装cmake,执行下面的命令安装cmake:
 

sudo apt-get install cmake

        然后执行build.sh程序:

./build.sh

4.编译完成后,在输入./build.sh install命令进行muduo库安装

        安装完成后,返回上一级目录,我们看到多了一个build目录,进去看看: 

        再进入后面的那个文件夹:

 

        这就是muduo库的头文件和库文件了。 

        上面的install命令并没有把它们拷贝到系统路径下,导致我们每次编译程序都需要指定muduo库的头文件和库文件路径,很麻烦,所以我们选择直接把inlcude(头文件)和lib(库文件)目录下的文件拷贝到系统目录下:

 

         这样就算安装好了,我们写一段测试代码:

#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++进行编译,注意链接muduo和pthread的库文件,编译命令如下:

g++ main.cpp -lmuduo_net -lmuduo_base -lpthread -std=c++11

         这是运行结果。

        等待客户端连接,可以打开一个新的shell命令行用netcat命令模拟客户端连接echo服务器进行功能测试,命令如下:

echo "hello world" | nc localhost 8888

         返回服务器端查看日志:

        这样muduo库就安装成功了。 


http://www.ppmy.cn/devtools/133879.html

相关文章

【前端】技术演进发展简史

一、前端 1、概述 1990 年&#xff0c;第一个web浏览器诞生&#xff0c;Tim 以超文本语言 HTML 为基础在 NeXT 电脑上发明了最原始的 Web 浏览器。 1991 年&#xff0c;WWW诞生&#xff0c;这标志着前端技术的开始。 前端&#xff08;Front-end&#xff09;和后端&#xff08;…

Spring Boot框架:电商系统的技术优势

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网上商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

DAY59||并查集理论基础 |寻找存在的路径

并查集理论基础 并查集主要有两个功能&#xff1a; 将两个元素添加到一个集合中。判断两个元素在不在同一个集合 代码模板 int n 1005; // n根据题目中节点数量而定&#xff0c;一般比节点数量大一点就好 vector<int> father vector<int> (n, 0); // C里的一…

设计模式-七个基本原则之一-接口隔离原则 + SpringBoot案例

接口隔离原则:(ISP) 面向对象七个基本原则之一 小而专用的接口&#xff1a;每个接口应专注于一组相关的功能。这样&#xff0c;类只需实现它们所需要的方法。避免“胖接口”&#xff1a;设计时应避免将过多功能集中在一个接口中。通过拆分接口&#xff0c;可以使得实现这些接口…

C++20 STL CookBook 7 Containers(II)

让vector在插入删除的时候仍然保证是有序的 首先&#xff0c;STL的确提供了一种办法来检查我们的目标容器是不是有序的&#xff1a;std::is_sorted - cppreference.com&#xff0c;也就是std::is_sorted。我们当然可以这样做&#xff1a; #include <iostream> #include…

AI大模型识别多人发音的实时语音交互理论研究

目录 摘要 第一章 引言 第二章 研究方法 2.1 多说话人分离技术 2.1.1 现有工具的使用与调优 2.2 语音识别与转录 2.2.1 调优后的实时识别代码&#xff1a; 2.3 音频流处理与队列管理 第三章 实时语音识别 3.1 多说话人分离技术的实时处理 3.2 AI 大模型的语音转文…

提取 Docker 镜像的 Dockerfile 工具集

在 Docker 开发和运维过程中,我们经常需要分析或重建已有镜像的 Dockerfile。无论是为了理解镜像的构建过程、优化镜像大小,还是出于安全审计的需求,能够从现有镜像中提取或重建 Dockerfile 都是一项非常有用的技能。本文将介绍一系列可以帮助我们完成这项任务的工具。 © …

单向链表题库2(c++)

目录 前言[1.力扣——LCR 123. 图书整理 I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/)[2.力扣——LCR 024. 反转链表](https://leetcode.cn/problems/UHnkqh/submissions/580256040/)[3.力扣LCR 141. 训练计划 III](https://leetcod…