Muduo是一个高性能的C++开源网络库,是一个基于Reactor模式的网络库,专为Linux平台下的并发非阻塞TCP网络编程设计。
muduo库是基于 boost 库开发的,所以需要在 Linux 平台上首先安装 boost 库。
1.boost库的安装
sudo apt-get install libboost-all-dev
2.安装muduo库
- 克隆muduo源码
打开终端,使用Git命令从Muduo的GitHub仓库克隆源代码到本地
git clone https://github.com/chenshuo/muduo
cd muduo
- 执行build.sh脚本的install选项来安装Muduo库。这个步骤通常会将Muduo的头文件和库文件安装到系统的某个目录下,以便在其他项目中使用。
./build.sh install
cd ..
ls (会发现出现一个build文件夹)
- 然而,需要注意的是,
build.sh install
命令可能并不会将Muduo的头文件和库文件安装到Linux的系统路径下(如/usr/include
和/usr/local/lib
),而是安装到了Muduo源代码目录下的某个子目录中(如build/release-install-cpp11
)。因此,需要将/build/release-install-cpp11下面的include和lib目录下的文件拷贝到系统目录下或者建立软链接。
cd build/release-install-cpp11/include
sudo mv muduo/ /usr/include/
cd ..
cd lib
sudo mv * /usr/local/lib/
完成以后使用muduo库编写C++网络程序,不用在指定头文件和lib库文件路径信息了,
因为g++会自动从/usr/include和/usr/local/lib路径下寻找所需要的文件。
- 检查安装目录
find /usr/include/muduo
如果找到,说明成功了,也可以自己用代码验证。
- 后续利用muduo库时遇到的问题
add_library(mprpc SHARED ${SRC_LIST}) include_directories(/usr/include/muduo) target_link_libraries(mprpc /usr/local/lib/libmuduo_net.a /usr/local/lib/libmuduo_base.a pthread)
CMake链接muduo库时发生如下错误:
/usr/bin/ld: /usr/local/lib/libmuduo_net.a(EventLoop.cc.o): relocation R_X86_64_TPOFF32 against `_ZN12_GLOBAL__N_118t_loopInThisThreadE' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: /usr/local/lib/libmuduo_net.a(InetAddress.cc.o): relocation R_X86_64_TPOFF32 against `_ZL15t_resolveBuffer' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: /usr/local/lib/libmuduo_base.a(Logging.cc.o): relocation R_X86_64_TPOFF32 against symbol `_ZN5muduo10t_errnobufE' can not be used when making a shared object; recompile with -fPIC collect2: error: ld returned 1 exit status make[2]: *** [src/CMakeFiles/mprpc.dir/build.make:129:~/MPRPC/lib/libmprpc.so] 错误 1 make[1]: *** [CMakeFiles/Makefile2:131:src/CMakeFiles/mprpc.dir/all] 错误 2 make: *** [Makefile:91:all] 错误 2
错误原因:将
libmuduo_net.a
和libmuduo_base.a
这两个静态库链接到一个共享库(libmprpc.so
)时,遇到了位置依赖性问题。即链接器(ld)发现这些静态库中的对象文件(.o
)没有以位置无关代码(PIC)的形式编译。需要确保libmuduo_net
和libmuduo_base
这两个库在编译时使用了-fPIC
选项。解决办法:在/muduo/muduo/net/CMakeLists.txt中添加set_target_properties(muduo_net PROPERTIES COMPILE_FLAGS "-fPIC")。执行./build.sh编译完成后安装。