gcc boost版本冲突解决日记
问题背景
项目在Ubuntu10 64位
boost 1.55,boost采用的是项目内包含相对目录的形式部署
项目采用了 -Wall -Wextra -Werror -Wconversion 最高的告警选项
单独测试是可以的
由于项目中包含的内容很多,头文件超多,因此只能选取1个简单的分支进行测试,可以再现问题,通过各种猜测和测试,最终定位到:
有GCC push_option对boost/thread进行处理后,stl容器使用完全异常[如 map<int,string>空内容时begin()!=end(),插入记录崩溃或死循环,2个机器上运行有细微差别,死循环时gdb attach可以看到map操作无法结束];而不用push_option时一切正常
解决方法
gcc -E 查看代码的预处理结果看到内容太多,没有再细致分析
既然gcc的这个选项和boost的thread有冲突,查看gcc的push_option说明,可见这个针对的时gcc 4.4,而ubuntu默认的gcc是version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) ,猜测是否这个实现有些问题
既然此路不同,我们是否可以把第三方库当成系统库用,最简单的方法时拷贝到/usr/include这类目录,但这个方法不实用
查gcc的手册,还真有这个选项-isystem https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Preprocessor-Options.html#Preprocessor-Options
-isystem ${ProjDirPath}/../../others
最终项目配置成这个选项进行编译即可
例子
单独新建工程如下,反而是正常的
g++ -L/opt/work/lib/static -L/opt/work/lib/ -o "zdemo" ./src/demo.o -lboost_system -lrt -lpthread -lboost_thread
#include <iostream>
#include <vector>
#include <map>
#pragma GCC push_options
#pragma GCC diagnostic ignored "-Wconversion"
#include <boost/thread.hpp>
#pragma GCC pop_options
#include <boost/make_shared.hpp>
#include <boost/bind.hpp>
using namespace std;
class Demo {
public:
Demo(const string & json){
this->rules[GET].push_back("hello");
this->rules[GET].push_back(json);
}
enum HttpMethod { ANY, GET, POST, PUT, DEL, OTHERS };
typedef vector<string> tRuleContainer;
map<HttpMethod, tRuleContainer> rules;
};
void demoThread(){
Demo u("world");
cout << u.rules.size() << endl;
}
int main() {
boost::shared_ptr<boost::thread> thrMon;
thrMon = boost::make_shared<boost::thread>(boost::bind(&demoThread));
Demo u("world");
cout << u.rules.size() << endl;
thrMon->join();
return 0;
}
gcc boost版本冲突解决日记的更多相关文章
- [转]SVN版本冲突解决详解
原文地址:http://blog.csdn.net/windone0109/article/details/4857044 版权声明:本文为博主原创文章,未经博主允许不得转载. 版本冲突原因: 假设A ...
- SVN常见错误和版本冲突解决
之前在Eclipse下面误删除了svn的一些插件包,后来重装了就问题重重,在这里还是建议, Windows下SVN最好使用桌面版,在文件管理器下面更新和提交. 1.常见错误整理 #, c-format ...
- SVN版本冲突解决详解
SVN版本冲突解决详解 分类: SVN(SubVersion)2009-11-23 15:45 27014人阅读 评论(12) 收藏 举报 svnsubversion服务器文档工作c 版本冲突原因: ...
- 【转】svn冲突问题详解 SVN版本冲突解决详解
(摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲 ...
- svn冲突问题详解 SVN版本冲突解决详解
svn冲突问题详解 SVN版本冲突解决详解 (摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svn ...
- .Net Framework项目引用.NetStandard标准库出现版本冲突解决办法
今天在工作中出现一个引用问题,害我找问题找了很久.起因是在一个Winform项目下需要引用一个.NetStandard标准库,标准库引用了System.ComponentModel.Annotatio ...
- Newtonsoft.Json 版本冲突解决
在做asp.net MVC 开发时,因为引用的dll 中使用了更高版本的 Newtonsoft.Json ,导致运行时发生错误, 查资料说是因为webApi使用了Newtonsoft.Json 导致了 ...
- SVN版本冲突解决
解决冲突有三种选择: A.放弃自己的更新,使用svn revert(回滚),然后提交.在这种方式下不需要使用svn resolved(解决) B.放弃自己的更新,使用别人的更新.使用最新获取的版本覆盖 ...
- linux 编译kernel与svn版本冲突解决方法 [drivers/gpu/mali/mali/common/mali_kernel_core.o] 错误 1
问题: 系统正常编译linux系统kernel,安装svn后,kernel编译出错. 错误: CHK include/linux/version.h CHK include/gene ...
随机推荐
- OpenCASCADE Coordinate Transforms
OpenCASCADE Coordinate Transforms eryar@163.com Abstract. The purpose of the OpenGL graphics process ...
- codeforces Round #320 (Div. 2) C. A Problem about Polyline(数学) D. "Or" Game(暴力,数学)
解题思路:就是求数 n 对应的二进制数中有多少个 1 #include <iostream> #include<cstdio> using namespace std; int ...
- Java内存模型深度解析:重排序 --转
原文地址:http://www.codeceo.com/article/java-memeory-2.html 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间 ...
- 【转】 个人认为,这是最详细的 android------HttpURLConnection 类用法详解。一些教材没讲到的,它讲到了
站在巨人的肩膀上,渐渐进步. 原文链接:http://www.blogjava.net/supercrsky/articles/247449.html 针对JDK中的URLConnection连接Se ...
- android UI 仿 win 8 模块化 标题,并实现 可长按拖动交换图片位置、可点击,且伴随动画特效
转载请声明出处,谢谢!http://www.cnblogs.com/linguanh/ 先上效果图,给大家个直观效果,后上实现代码: -> ->-> ok,现在简单说下我上面的 ...
- struts2学习笔记--OGNL表达式1
struts2标签库主要使用的是OGNL语言,类似于El表达式,但是强大得多,它是一种操作对象属性的表达式语言,OGNL有自己的优点: 能够访问对象的方法,如list.size(); 能够访问静态属性 ...
- HTML5 Canvas 画布
一.Canvas是什么? canvas,是一个画布,canvas元素用于在网页上绘制图形. canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. 二.创建Canvas元素 加上基本的属 ...
- 使用phpize安装php扩展
环境: CentOs 6.3 php 7 nginx 举例: 安装ssh2扩展 1.登陆http://pecl.php.net,搜索ssh2,如下图所示,注意版本的选择要根据php的版本来 2.下载s ...
- ASP.NET的session操作方法总结
在开发ASP.NET程序时,需要对相关数据进行缓存,缓存较多的主要是用户的身份信息,现提供几个对session操作较为常用的方法: 1.添加session,对设置对应的时间: /// <summ ...
- Angularjs promise对象解析
1.先来看一段Demo,看完这个demo你可以思考下如果使用$.ajax如何处理同样的逻辑,使用ng的promise有何优势? var ngApp=angular.module('ngApp',[]) ...