cpp-netlib的编译与测试

传闻cpp-netlib被提名作为boost的network库,因此我也体验一下,感觉非常优秀,相比以前使用GoLang-http或python-twisted这类框架,有优胜之处。但在编译和搭建上,会略有一些困难。在centos6.8系统里,以下是它的构建过程。
1.前期准备:
cpp-netlib版本是之匹配的boost版本,可以在cpp-netlib的CMakeList.txt里找到。
当前cpp-netlib为0.12.0版本,所对应的boost版本为v1.57.0版本。
2.下载boost-v1.57.0版本。
http://pilotfiber.dl.sourceforge.net/project/boost/boost/1.57.0/boost_1_57_0.tar.bz2
3.安装boost
tar -xf boost_1_57_0.tar.bz2
cd boost_1_57_0
./bootstrap.sh
./b2 --build-type=complete --layout=versioned
sudo ./b2 install --prefix=/boost-1.57.0

4.编辑/etc/profile文件,添加boost环境变量,并重启系统,确保环境变量生效。
export BOOST_ROOT=/boost-1.57.0
5.下载cpp-netlib,当前版本是0.12.0版本,下载地址如下:
http://downloads.cpp-netlib.org/0.12.0/cpp-netlib-0.12.0-final.tar.bz2
6.解压并修改parsers.ipp文件。
vim cpp-netlib-0.12.0-final\boost\network\protocol\http\server\impl\pasers.ipp

#include <boost/fusion/include/std_tuple.hpp>
改为
#include <boost/fusion/adapted/std_tuple.hpp>
7.编译
mkdir cpp-netlib-build
cd cpp-netlib-build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/gcc-4.8.5/bin/gcc -DCMAKE_CXX_COMPILER=/gcc-4.8.5/bin/g++ -DCMAKE_INSTALL_PREFIX=/boost-1.57.0 /home/abc/Downloads/cpp-netlib-0.12.0-final
make
sudo make install

8.上一步,仅是安装了cpp-netlib-0.12.0-final目录下network库及其相关的库文件,如下:
cppnetlib-server-parsers
cppnetlib-uri
cppnetlib-client-connections

9.上一步仍缺少asio库,它自带asio库与boost.asio有很多不一样,为了避免不必要的编译错误可能存在问题,也复制一份asio库到相应目录,如下。
cd cpp-netlib-0.12.0-final/deps/asio/asio/include
sudo cp asio asio.hpp Makefile.am /boost-1.57.0/include/ -R

注:因为只是复制头文件,在CMake中需要配置宏定义,以确保只使用头文件。
add_definitions(-DASIO_HEADER_ONLY)
10.可以编写代码测试了,为了便于测试,本人直接拷贝hello_world_async_server_with_work_queue.cpp代码,重命名为main.cpp。
11.编写CMakeList.txt文件。
cmake_minimum_required(VERSION 3.5)
project(asynhello)

set(CMAKE_C_COMPILER "/gcc-4.8.5/bin/gcc")
set(CMAKE_CXX_COMPILER "/gcc-4.8.5/bin/g++")
message("CMAKE_C_COMPILER=${CMAKE_C_COMPILER}")
message("CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}")
# -static-libstdc++这个是避免使用gcc-4.8.5时产生要链接到新版本的libstdc的问题。如下
# 解决/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found
# -static-libgcc是为了解决对gcc的libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1的依赖。
# -static是为了解决其它库的动态库连接依赖,但可能会因某些库不存在静态库,可能报错。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -std=c++11")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -static -std=c++11")
add_definitions(-DASIO_HEADER_ONLY)
set(Boost_USE_STATIC_LIBS ON) # only find static libs
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME ON)
find_package(Boost 1.57.0)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
link_directories(/boost-1.57.0/lib64)
set(SOURCE_FILES main.cpp)
add_executable(asynhello ${SOURCE_FILES})
target_link_libraries(asynhello ${Boost_LIBRARIES})
target_link_libraries(asynhello ${CMAKE_THREAD_LIBS_INIT} cppnetlib-server-parsers cppnetlib-uri cppnetlib-client-connections rt)
#使用boost_thread会导致增加libboost_system.so和libboost_thread.so两个库的引入,优先使用rt代替boost_thread。
#target_link_libraries(helloserver ${CMAKE_THREAD_LIBS_INIT} cppnetlib-server-parsers boost_thread)
endif()

注:CMake关于Boost的编写,可以下参考下文件:
https://cmake.org/cmake/help/v3.0/module/FindBoost.html
https://cmake.org/cmake/help/v3.0/manual/cmake-modules.7.html
12.编译测试
cmake ./ && make
13.测试代码
https://github.com/kxtry/cpp-netlib-example