今天开始了陈硕大大的《linux多线程服务端编程》之旅,进行muduo网络库的学习,这里主要记录一下在win11下WSL的ubuntu子系统中进行的muduo的安装。
首先,由于muduo是采用cmake作为build system,所以先要安装cmke,另外由于muduo依赖于Boost(核心库依赖TR1),所以Boost也一并安装了。
sudo apt-get install cmake
sudo apt-get install libboost-dev libboost-test-dev
然后就开始安装muduo吧,书本中介绍muduo原本是在google的代码托管平台进行存放,其实现在已经转移到了github上,所以只需要使用git来客隆一下即可(安装git其实很简单,大家可以百度一下就知道了,这里不做详述)
sudo git clone https://github.com/chenshuo/muduo
因为git的clone命令如果没指定路径,是会把当前目录作为目的路径的,所以我切换到了其他路径,由于权限需要,就使用sudo暂时提升一下权限,搞定以后,就可以看到当前目录下的muduo目录,进入muduo目录,输入./build.sh开始构建,不过它显示ln -sf
B
U
I
L
D
D
I
R
/
BUILD_DIR/
BUILDDIR/BUILD_TYPE-cpp11/compile_commands.json和mkdir执行被拒,即permission dennied,这下头疼了,只好进行build.sh脚本的命令修改,在这两个命令和后面的cmake命令和make命令都添加sudo前缀,这样执行就不会有问题了。
如下:
#!/bin/sh
set -x
SOURCE_DIR=`pwd`
BUILD_DIR=${BUILD_DIR:-../build}
BUILD_TYPE=${BUILD_TYPE:-release}
INSTALL_DIR=${INSTALL_DIR:-../${BUILD_TYPE}-install-cpp11}
CXX=${CXX:-g++}
sudo ln -sf $BUILD_DIR/$BUILD_TYPE-cpp11/compile_commands.json
sudo mkdir -p $BUILD_DIR/$BUILD_TYPE-cpp11 \
&& cd $BUILD_DIR/$BUILD_TYPE-cpp11 \
&& sudo cmake \
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
-DCMAKE_INSTALL_PREFIX=$INSTALL_DIR \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
$SOURCE_DIR \
&& sudo make $*
# Use the following command to run all the unit tests
# at the dir $BUILD_DIR/$BUILD_TYPE :
# CTEST_OUTPUT_ON_FAILURE=TRUE make test
# cd $SOURCE_DIR && doxygen
不过,./build.sh执行完毕,只在/usr/include/build目录中找到release目录(内含bin目录和lib目录,即可执行文件和静态库文件),并没有我们需要的头文件和库文件,回头看书,发现应该执行./build.sh install命令才有想要的release-install目录,但是执行时cmake报错了,为何?因为它找不到protobuf和curl的依赖,哦豁,忘记安装了
sudo apt-get install libcurl4-openssl-dev libc-ares-dev
sudo apt-get install protobuf-compiler libprotobuf-dev
这样一来,就基本编译好了我们需要的头文件和库文件了,让我们运行一下看看,切换到release-cpp11(我们生成的build目录下,即前面说的release目录,这个名字应该是更新了c++11标准)的bin目录下,运行一下测试程序inspector_test
jack@DESKTOP-SJO8SMG:/usr/include/build/release-cpp11/bin$ ./inspector_test
20211210 14:43:57.949897Z 4627 WARN HttpServer[Inspector:test] starts listening on 0.0.0.0:12345 - HttpServer.cc:53
应该可以得到上面的响应,然后我们在浏览器访问本地ip的12345端口(http://127.0.0.1:12345/)应该可以得到以下界面
然后我们的服务器程序响应如下:
20211210 14:45:09.441062Z 4627 INFO TcpServer::newConnection [Inspector:test] - new connection [Inspector:test-0.0.0.0:12345#1] from 127.0.0.1:33248 - TcpServer.cc:80
20211210 14:45:09.441768Z 4627 INFO TcpServer::newConnection [Inspector:test] - new connection [Inspector:test-0.0.0.0:12345#2] from 127.0.0.1:33250 - TcpServer.cc:80
20211210 14:47:20.255819Z 4627 INFO TcpServer::removeConnectionInLoop [Inspector:test] - connection Inspector:test-0.0.0.0:12345#2 - TcpServer.cc:109
这样应该就ok了。