您的位置:首页 > 其它

Proxygen编译安装和开发环境的搭建

2017-08-07 10:47 2386 查看
Proxygen是facebook开源的高性能的http框架,它和thriftrpc一起,构成一套http和rpc的访问的姊妹框架。由于项目的选用了thrift作为rpc框架,所以采用proxygen作为对外提供http服务的框架。

首先,下载proxygen源码,地址:

https://github.com/facebook/proxygen

运行deps.h脚本,该脚本首先安装proxygen的所有依赖包,然后生成编译配置,最后编译

./deps.sh

最后在编译过程中出现问题:


/usr/include/glog/logging.h:672: undefined reference to

`google::base::CheckOpMessageBuilder::NewString()

编译glog时报错。该问题还是由于本机编译器时gcc-4.9,安装的glog包采用gcc-5.0以上版本的编译器编译导致的,解决的办法就是重新下载glog源码,采用gcc-4.9的编译器重新编译安装。

https://derickrethans.nl/hhvm-gcc-52.html

这理由详细的编译步骤,请参考。

重编glog之后,请记住确认新编译版本的安装路径以及/usr/include和/usr/lib目录下是否有之前安装的过的glog的相关库和头文件,如果有请删除,否则依然会报错,因为系统编译时会优先查找这些路径,(关于编译链接和运行时的搜索路径的方式以及通过ldconfig配置搜索路径的方法,请自行百度)

重新运行deps.sh,在folly 检查依赖库时报错,glog库不可用,查看 folly/folly/config.log日志,其中由如下报错:

undefined reference to `gflags::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)

这个函数时glog依赖的gflags中的函数,去gflags头文件的安装目录/usr/include/gflags下查看gflags.h文件,函数的定义时这样的:

template <typename FlagType>
FlagRegisterer(const char* name,
const char* help, const char* filename,
FlagType* current_storage, FlagType* defvalue_storage);


很显然glog中的引用多了一个参数,应该是glog和gflags的版本不匹配导致的。所以gflags也要下载和glog对应的版本重新编译安装。我是直接在git拉最新的glog和gflags版本重新编译的,参考:

http://www.cnblogs.com/burningTheStar/p/6986048.html

这里有一个问题,folly在glog链接gflags时采用的是动态库连接,但是gflags在cmake编译时默认是静态库安装,所以安装之后folly检查依赖时依然会报找不到gflags的错误。gflags编译成动态库需要使用ccmake配置:

1,ccmake ..

(高版本的cmake没有ccmake工具,我本身是cmake-3.6.1,重新安装了cmake-3.5.1之后才可使用ccmake)



执行ccmake之后会有这样一个配置界面,把动态库选项设为on

2,cmake .. && make install

最后记得删除之前安装的gflags版本

解决以上问题之后,终于可以正常编译,但最后依然有编译错误 。。。。



virtual memory exhausted: Cannot allocate memory

系统虚拟内存不足,分配空间失败了。。。

(计算机的物理内存时有限的,为了有效利用资源,操作系统通过虚拟内存的方式,跟物理内存建立映射,通过数据换入换出的方式以有效提高物理内存的利用率,节约内存资源。关于操作系统内存管理,可以看看程序员自我修养和深入理解计算机操作系统,有详细的讲解)

用free -k 查看我的磁盘



我的虚拟机没有swap分区,我没有创建swap分区,而是采用创建一个swap文件,以增加虚拟内存的置换空间,参考这篇:

http://blog.csdn.net/finewind/article/details/50824410

最后再次执行deps.sh,终于大功告成^^

编译结果



安装路径:





我们来按git上给出的方法测试一下proxygen源码里面echoserver示例:

编译:

g++ -std=c++14 -o my_echo EchoServer.cpp EchoHandler.cpp

-lproxygenhttpserver -lfolly -lglog -lgflags -pthread

运行:



新开一个终端,访问echoserver:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  框架