热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CentOS7.8下编译muduo库找不到Boost库报错的解决方法

本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。

很早之前在CentOS7下编译安装过陈硕的muduo库并且成功运行示例程序muduo-tutorial,但是今天从github上面下载muduo源代码确报错了,提示Boost库找不到,但是我明明安装过Boost1.69.0的
陈硕老师的Github为:https://github.com/chenshuo
muduo_chenshuo


一、从Github上 下载muduo和muduo-tutorial源代码


下载muduo源代码

git clone https://github.com/chenshuo/muduo.git

muduo01


下载muduo-tutorial示例程序

git clone https://github.com/chenshuo/muduo-tutorial.git

muduo02


二、编译muduo库

进入到刚才下载的muduo目录,比如我的腾讯云主机上muduo的下载目录为:/root/GithubProjects

muduo03
按照muduo Github官网README中的说法, 只需要编译muduo库根目录下的build.sh可执行文件即可。

Muduo is a multithreaded C++ network library based on
the reactor pattern.http://github.com/chenshuo/muduoCopyright (c) 2010, Shuo Chen. All rights reserved.Use of this source code is governed by a BSD-style
license that can be found in the License file.Requires:Linux kernel version >= 2.6.28.GCC >= 4.7 or Clang >= 3.5Boost (for boost::any only.)Tested on:Debian 7 and aboveUnbuntu 14.04 and aboveCentOS 7 and aboveTo build, run:./build.shSee https://github.com/chenshuo/muduo-tutorial for
how to use muduo in your project.__ __ _| \/ | | || \ / |_ _ __| |_ _ ___| |\/| | | | |/ _` | | | |/ _ \| | | | |_| | (_| | |_| | (_) ||_| |_|\__,_|\__,_|\__,_|\___/

我的腾讯云主机的系统是CentOS7.8
centOS7.8
在muduo源代码所在目录执行build.sh脚本报错,错误信息如下图所示:
Could not find Boost
从错误信息可以看出找不到Boost库的头文件所在路径,于是我查看了一下muduo源代码根目录下的CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.6)project(muduo C CXX)enable_testing()if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE "Release")
endif()# only build examples if this is the main project
if(CMAKE_PROJECT_NAME STREQUAL "muduo")option(MUDUO_BUILD_EXAMPLES "Build Muduo examples" ON)
endif()set(CXX_FLAGS-g# -DVALGRIND-DCHECK_PTHREAD_RETURN_VALUE-D_FILE_OFFSET_BITS=64-Wall-Wextra-Werror-Wconversion-Wno-unused-parameter-Wold-style-cast-Woverloaded-virtual-Wpointer-arith-Wshadow-Wwrite-strings-march=native# -MMD-std=c++11-rdynamic)
if(CMAKE_BUILD_BITS EQUAL 32)list(APPEND CXX_FLAGS "-m32")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")list(APPEND CXX_FLAGS "-Wno-null-dereference")list(APPEND CXX_FLAGS "-Wno-sign-conversion")list(APPEND CXX_FLAGS "-Wno-unused-local-typedef")list(APPEND CXX_FLAGS "-Wthread-safety")list(REMOVE_ITEM CXX_FLAGS "-rdynamic")
endif()
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CXX_FLAGS}")set(CMAKE_CXX_FLAGS_DEBUG "-O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)find_package(Boost REQUIRED)
find_package(Protobuf)
find_package(CURL)
find_package(ZLIB)
find_path(CARES_INCLUDE_DIR ares.h)
find_library(CARES_LIBRARY NAMES cares)
find_path(MHD_INCLUDE_DIR microhttpd.h)
find_library(MHD_LIBRARY NAMES microhttpd)
find_library(BOOSTTEST_LIBRARY NAMES boost_unit_test_framework)
find_library(BOOSTPO_LIBRARY NAMES boost_program_options)
find_library(BOOSTSYSTEM_LIBRARY NAMES boost_system)
find_path(TCMALLOC_INCLUDE_DIR gperftools/heap-profiler.h)
find_library(TCMALLOC_LIBRARY NAMES tcmalloc_and_profiler)
find_path(HIREDIS_INCLUDE_DIR hiredis/hiredis.h)
find_library(HIREDIS_LIBRARY NAMES hiredis)
find_path(GD_INCLUDE_DIR gd.h)
find_library(GD_LIBRARY NAMES gd)
find_program(THRIFT_COMPILER thrift)
find_path(THRIFT_INCLUDE_DIR thrift)
find_library(THRIFT_LIBRARY NAMES thrift)if(CARES_INCLUDE_DIR AND CARES_LIBRARY)message(STATUS "found cares")
endif()
if(CURL_FOUND)message(STATUS "found curl")
endif()
if(PROTOBUF_FOUND)message(STATUS "found protobuf")
endif()
if(TCMALLOC_INCLUDE_DIR AND TCMALLOC_LIBRARY)message(STATUS "found tcmalloc")
endif()
if(ZLIB_FOUND)message(STATUS "found zlib")
endif()
if(HIREDIS_INCLUDE_DIR AND HIREDIS_LIBRARY)message(STATUS "found hiredis")
endif()
if(GD_INCLUDE_DIR AND GD_LIBRARY)message(STATUS "found gd")
endif()
if(THRIFT_COMPILER AND THRIFT_INCLUDE_DIR AND THRIFT_LIBRARY)message(STATUS "found thrift")
endif()include_directories(${Boost_INCLUDE_DIRS})include_directories(${PROJECT_SOURCE_DIR})string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
message(STATUS "CXX_FLAGS = " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}})add_subdirectory(muduo/base)
add_subdirectory(muduo/net)if(MUDUO_BUILD_EXAMPLES)add_subdirectory(contrib)add_subdirectory(examples)
else()if(CARES_INCLUDE_DIR AND CARES_LIBRARY)add_subdirectory(examples/cdns)endif()
endif()

从上述CMakeLists.txt文件中可以看出,muduo库依赖于Boost、ProtoBuf、CURL、ZLIB等库的。我的腾讯云CentOS7.8系统下已经安装过了Boost1.69和ProtoBuf3.9.1
libs
命名自己将Boost1.69.0安装到/usr/local/boost目录下了,为什么muduo库找不到呢?很是纳闷,估计是/usr/local/boost目录不是默认的安装目录所以会导致这个问题吧,最后找到了如下两篇博客:



  • Linux下使用CMake进行编译的时候寻找Boost库

  • cmake使用boost库

cmake_minimum_required(VERSION 2.8.3)
project(boost_test)
find_package(Boost REQUIRED COMPONENTS system thread)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(boost_test boost_test.cpp)
target_link_libraries(boost_test ${Boost_LIBRARIES})

还有CMake官方提供的FindBoost
FindBoost

根据简书上的这篇博客Linux下使用CMake进行编译的时候寻找Boost库

cmake_boost
所以解决办法很明了了,既然muduo库找不到我安装的boost1.69.0的头文件所在目录,那么我修改一下CMakeLists.txt文件,在find_package(Boost REQUIRED)这句查找Boost库之前,手动设置boost根目录、头文件、lib库文件所在目录就好了即:
可以在搜索package之前,通过设置一些变量来帮助boost库的查找

BOOST_ROOT - 首选的Boost安装路径
BOOST_INCLUDEDIR - 首选的头文件搜索路径 e.g. <prefix>/include
BOOST_LIBRARYDIR - 首选的库文件搜索路径 e.g. <prefix>/lib
Boost_NO_SYSTEM_PATHS - 默认是OFF. 如果开启了,则不会搜索用户指定路径之外的路径

所以可以首先设置BOOST_ROOT、BOOST_INCLUDEDIR、BOOST_LIBRARYDIR这几个变量的值,改成自己的Boost库的目录,比如我的Boost1.69.0的安装目录是: /usr/local/boost

set (BOOST_ROOT /usr/local/boost)
set (BOOST_INCLUDEDIR ${BOOST_ROOT}/include)
set (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib)

修改后的CMakeLists.txt文件如下所示:

cmake_minimum_required(VERSION 2.6)project(muduo C CXX)enable_testing()if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE "Release")
endif()# only build examples if this is the main project
if(CMAKE_PROJECT_NAME STREQUAL "muduo")option(MUDUO_BUILD_EXAMPLES "Build Muduo examples" ON)
endif()set(CXX_FLAGS-g# -DVALGRIND-DCHECK_PTHREAD_RETURN_VALUE-D_FILE_OFFSET_BITS=64-Wall-Wextra#-Werror-Wconversion-Wno-unused-parameter#-Wold-style-cast-Woverloaded-virtual-Wpointer-arith#-Wshadow-Wwrite-strings-march=native# -MMD-std=c++11-rdynamic)
if(CMAKE_BUILD_BITS EQUAL 32)list(APPEND CXX_FLAGS "-m32")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")list(APPEND CXX_FLAGS "-Wno-null-dereference")list(APPEND CXX_FLAGS "-Wno-sign-conversion")list(APPEND CXX_FLAGS "-Wno-unused-local-typedef")list(APPEND CXX_FLAGS "-Wthread-safety")list(REMOVE_ITEM CXX_FLAGS "-rdynamic")
endif()
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CXX_FLAGS}")set(CMAKE_CXX_FLAGS_DEBUG "-O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)# 在搜索Boost的package之前,通过设置一些变量来帮助boost库的查找
set (BOOST_ROOT /usr/local/boost)
set (BOOST_INCLUDEDIR ${BOOST_ROOT}/include)
set (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib)# 寻找boost库
find_package(Boost REQUIRED)if (Boost_FOUND)message( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")message( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")message( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
endif()find_package(Protobuf)
find_package(CURL)
find_package(ZLIB)
find_path(CARES_INCLUDE_DIR ares.h)
find_library(CARES_LIBRARY NAMES cares)
find_path(MHD_INCLUDE_DIR microhttpd.h)
find_library(MHD_LIBRARY NAMES microhttpd)if(Boost_FOUND)find_library(BOOSTTEST_LIBRARY NAMES boost_unit_test_framework)find_library(BOOSTPO_LIBRARY NAMES boost_program_options)find_library(BOOSTSYSTEM_LIBRARY NAMES boost_system)
endif()find_path(TCMALLOC_INCLUDE_DIR gperftools/heap-profiler.h)
find_library(TCMALLOC_LIBRARY NAMES tcmalloc_and_profiler)
find_path(HIREDIS_INCLUDE_DIR hiredis/hiredis.h)
find_library(HIREDIS_LIBRARY NAMES hiredis)
find_path(GD_INCLUDE_DIR gd.h)
find_library(GD_LIBRARY NAMES gd)
find_program(THRIFT_COMPILER thrift)
find_path(THRIFT_INCLUDE_DIR thrift)
find_library(THRIFT_LIBRARY NAMES thrift)if(CARES_INCLUDE_DIR AND CARES_LIBRARY)message(STATUS "found cares")
endif()
if(CURL_FOUND)message(STATUS "found curl")
endif()
if(PROTOBUF_FOUND)message(STATUS "found protobuf")
endif()
if(TCMALLOC_INCLUDE_DIR AND TCMALLOC_LIBRARY)message(STATUS "found tcmalloc")
endif()
if(ZLIB_FOUND)message(STATUS "found zlib")
endif()
if(HIREDIS_INCLUDE_DIR AND HIREDIS_LIBRARY)message(STATUS "found hiredis")
endif()
if(GD_INCLUDE_DIR AND GD_LIBRARY)message(STATUS "found gd")
endif()
if(THRIFT_COMPILER AND THRIFT_INCLUDE_DIR AND THRIFT_LIBRARY)message(STATUS "found thrift")
endif()if(Boost_FOUND)include_directories(${Boost_INCLUDE_DIRS})
endif()include_directories(${PROJECT_SOURCE_DIR})string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
message(STATUS "CXX_FLAGS = " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}})add_subdirectory(muduo/base)
add_subdirectory(muduo/net)if(MUDUO_BUILD_EXAMPLES)add_subdirectory(contrib)add_subdirectory(examples)
else()if(CARES_INCLUDE_DIR AND CARES_LIBRARY)add_subdirectory(examples/cdns)endif()
endif()

修改CMakeLists.txt再运行build.sh脚本,需要注意的是还需要在设置CXX_FLAGS变量时,注释掉如下三个预处理指令:

#-Werror#-Wold-style-cast#-Wshadow

不然可能会在CentOS7下编译muduo报错。CentOS7下编译muduo库需要一些时间:
build_muduo01

build_muduo_final
从上图可以看出,我们成功编译了muduo源代码。
release-cpp11
可以看到在/root/GithubProjects/build目录下生成了release-cpp11目录,里面有如下目录和文件,包括可执行程序、lib、examples、muduo目录:
dirs


三、使用cmake编译安装muduo库

cd /root/GithubProjects/muduo
mkdir build
cd build
cmake ..
make
make install

muduo_install
可以看到执行make install后,头文件被拷贝到了/usr/local/muduo目录下,lib库文件拷贝到了/usr/local/lib目录下。


四、使用编译muduo-tutorial

muduo-tutorial示例程序的README文件描述了如何使用muduo库:

Examples of Muduo network library0) src - source file
1) bazel - build with Bazel
2) cmake-submodule - build with CMake, checking out muduo as a git submodule
3) cmake - build with CMake
2) makefile - build with Makefile1) build with bazel
cd bazel
bazel build -c opt :all2) build with CMake with git submodule
git submodule update --init
mkdir build
cd build
cmake ../cmake-submodule
makeAssuming Muduo is installed in $HOME/build/debug-install3) build with CMake
mkdir build
cd build
cmake ../cmake
make
# echo binary is in ./bin/4) build with GNU make
cd makefile
make
# echo binary is in ./

上面4种方法中,我所熟悉的是第三种和第四种,这里我以cmake第三种为例:
注意:不论使用make还是cmake也好,注意:muduo库的路径需要根据自己编译后的路径为准。


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
  • 1.利用node实现页面实时更新,主要 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
author-avatar
canku
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有