编译boost.log模块遇到的一些问题
线上日志用到的是日志库,在全局有一个锁,导致在高并发的时候,容易因为锁竞争问题导致时延。在某些情况下,会因为同一个用户,同时访问某个变量,导致读写冲突使线上服务整体core掉(考虑到请求的间隔,为了应对偶发1%%的情形,如果加锁会对整体性能有一定的影响,所以当时权衡就没有加锁)。
于是就想把这个日志库的依赖去掉。正好大组内有人通过用boost.log来解决该问题,并且提供了分钟级别的切分封装,与当前线上的日志是兼容的,后续只需要压测一下,验证下功能即可。但我们的系统centos7所内置的boost库版本为1.53,但网上查询得知boost.log在1.54之后才有,所以考虑通过结合blade静态编译的方式将boost库整体封装到代码库中。
在编译boost.log中遇到了如下问题
1)DSO missing from command line
参考 https://segmentfault.com/a/1190000002462705
场景是:
- 我们有一个shared libA中,定义了函数foo()
- 另一个静态库libB显示地链接了libA
- 一个可执行文件bin_c显示地链接了libA
那么问题来了,如果bin_c中调用了函数foo(),那么编译能不能通过?
在binutils<2.22时,ld正常完成了,bin_c对于foo的调用经由libB,传递到了libA,链接成功。
但是当binutils>=2.22时,编译出错了,ld会报上面的错,告诉你foo这个symbol解析不到,这时,我们需要编译bin_c时,显示地链接libA才可以通过。
binutils2.22开始,其中的ld开始把--no-copy-dt-needed-entries默认打开,这样一来,ld不会再自动递归地解析链接的lib,而需要由用户来一一指定。
在blade的BUILD依赖中,显式的写上lib依赖即可。
2)使用动态库链接 时应注意:
要定义 BOOST_LOG_DYN_LINK 或者 BOOST_ALL_DYN_LINK
同时在build文件中也需要这样定义
3)编译支持多线程的regex和线程库
./bjam stage --with-regex --with-thread --build-type=complete --layout=tagged \
--toolset=gcc-4.9 architecture=x86 address-model=64 \
define=BOOST_ALL_DYN_LINK
经过编译好的lib,测试即可达到我们要的需求。
编译boost.log模块遇到的一些问题的更多相关文章
- 编译boost python模块遇到的错误:../../libraries/boost_1_44_0/boost/python/detail/wrap_python.hpp:75:24: fatal error: patchlevel.h: No such file or directory
就是遇到类似标题上面的错误. 原因是没有安装对应python的python-dev依赖,不然编译到boost python模块的时候就会出错. 所以解决方案是sudo apt-get install ...
- windows上编译boost库
要用xx库,编译boost时就指定--with-xx.例如: # 下载并解压boost_1.58 # 进入boost_1.58目录 bjam.exe toolset=msvc-14.0 --build ...
- C++ 系列:编译 boost
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- boost.asio与boost.log同时使用导致socket不能正常收发数据
现象: 1. 没有使用boost.log前能正常收发数据 2.加入boost.log后async_connect没有回调 fix过程: 1. gdb调试发现程序block在pthread_timed_ ...
- VS2010编译Boost 1.57 静态链接库
http://www.cnblogs.com/cuish/p/4175491.html 0.前提 Boost库版本 1.57.0 下载地址 http://www.boost.org/users/his ...
- clang 搭建和编译boost 和zero ICE库 (Ubuntu10 64)
相关介绍资料如下: Boost编译http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz/downlo ...
- boost.log要点笔记
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- 【转】单独编译android framework模块出现的问题
原文网址:http://blog.csdn.net/leonan/article/details/8629561 全编andorid后,单独修改编译一个framwork模块,make snod会有如下 ...
- vim编译安装+lua模块
vim编译安装+lua模块 使用背景:代码自动补全插件,需要安装lua模块 安装准备,首先下载安装vim所依赖的其它安装包,ncurses,lua,readline,vim 源码下载,编译安装 ncu ...
随机推荐
- 将 UWP 的有效像素(Effective Pixels)引入 WPF
在很久很久以前,WPF 诞生之初,有一个神奇的单位,它的名字叫做——设备无关单位(DIP,Device Independent Unit).微软给它描绘了一片美好的愿景——在任何显示器上显示的尺寸是相 ...
- {vlFeat}{matlab}{VS2010}{编译配置}
运行程序需要vlfeat与mex等在matlab与vs2010中配置,碰到了不少困难,下面给出解决方案 1.下载vlfeat,但是vlfeat目录中并没有编译好的mex文件,需要在vs2010中编译 ...
- tidb 集群扩容
1. tidb 新增节点 a. 编辑 inventory.ini [tidb_servers] 10.0.230.14 10.0.230.15 10.10.230.20 b. 初始化新增节点 ansi ...
- 编写浏览器和Node.js通用的JavaScript模块
长期以来JavaScript语言本身不提供模块化的支持, ES6中终于给出了 from, import等关键字来进行模块化的代码组织. 但CommonJS.AMD等规范已经被广为使用,如果希望你的Ja ...
- 虚拟主机wordpress文件上传大小限制更改
默认的wp文件上传的大小都是2M 登录阿里云进入控制面板找到你的虚拟机实例 点击管理 改成10M,最大也就是10,虚拟机的睾丸之处.保存,去页面新媒体添加可以看到最大限制为10M了
- i.e 和e.g 的区别
i.e 和e.g 的区别 两者都是拉丁文缩写 i.e是id est的缩写,意思是that is. e.g是exempli gration的缩写,意思是for example;
- Socket客户端
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- 小小的学习FPGA建议
学习FPGA,一点小小的 建议或者总结分享. 语法层面搞懂阻塞和非阻塞语句,以及Verilog语言的时序描述方法,把自己想象成编译器,尝试去编译自己写的Module,不断总结自己设计的逻辑会综合出怎么 ...
- Netty--TCP粘包和拆包
TCP协议以流的方式进行数据传输,它无法理解其上层协议的数据意义,而是根据TCP缓冲区的大小对数据进行拆分或组装,即上层一个完整的包可能被拆为几个TCP包来发送,或上层几个包会被组合为一个TCP包发送 ...
- charles 设置弱网测试
Charles简介:Charles支持抓去http.https协议的请求,不支持socket. 然后charles会自动配置IE浏览器和工具的代理设置,所以说打开工具直接就已经是抓包状态了. 这里打开 ...