##1下载解压
并同时安装cmake
2 编译
1)修改cmakelist
将CMakelist.txt文件中的option那一行注释掉,因为muduo库源码编译会编译很多unit_test测试用例代码,编译耗时长,我们也用不到。
2)执行build.sh
运行:
sh build.sh
开始编译,等到编译完成:
3 安装
运行:
sudo sh build.sh install
这个./build.sh install实际上把muduo的头文件和lib库文件放到了muduo-master同级目录下的build目录下的release-install-cpp11文件夹(分别在include和lib)下面了。
如果在程序中使用muduo中的函数或类的话,首先就是要#include头文件,只包含有文件名系统是找不到的,可以手动在程序中#include头文件的绝对路径。或者方法二是在程序中#include文件名,然后再g++编译选项中设定 -include 选项。
然后是库文件,首先明确的是,编译后的muduo是一个静态库,如果静态库没有放在系统的默认路径下(/usr/local/lib,/usr/lib,/lib),那么在g++编译使用了muduo的程序的时候,需要加上-L选项指定库文件路径。(当然不管库文件是不是在默认路径下, -l选项指定库文件是必须的。)
(如果静态库文件不在默认路径中,似乎不需要像动态库那样还要设定LD_LIBARY_PATH或者/etc/ld.so.conf)。
当然,完全可以将muduo的头文件和库文件放到系统的默认路径下,这样就可以在程序中使用了。只需在编译的时候设定-l选项就行了。(通常/usr/include和/usr/lib放系统的一些头文件和库,/usr/local/include和/usr/local/lib放用户自己安装的一些头文件和库。)
1)将头文件复制到usr/local/include
2) 将库文件复制到/usr/local/lib
另外,观察muduo的库,发现确实是静态库:
4 测试
把muduo库的头文件和lib库文件拷贝完成以后,使用muduo库编写一个简单的echo回显服务器,测试muduo库是否可以正常使用,代码如下:
#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
编译链接完成,生成a.out可执行程序,上面的echo服务器监听8888端口,运行上面的a.out回显服务器如下:
等待客户端连接,可以打开一个新的shell命令行用netcat命令模拟客户端连接echo服务器进行功能测试,命令如下:
客户端数据回显正确,看看服务器接日志信息也正常,到此,muduo安装成功,能够正常进行C++网络程序开发!