问题背景

项目在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版本冲突解决日记的更多相关文章

  1. [转]SVN版本冲突解决详解

    原文地址:http://blog.csdn.net/windone0109/article/details/4857044 版权声明:本文为博主原创文章,未经博主允许不得转载. 版本冲突原因: 假设A ...

  2. SVN常见错误和版本冲突解决

    之前在Eclipse下面误删除了svn的一些插件包,后来重装了就问题重重,在这里还是建议, Windows下SVN最好使用桌面版,在文件管理器下面更新和提交. 1.常见错误整理 #, c-format ...

  3. SVN版本冲突解决详解

    SVN版本冲突解决详解 分类: SVN(SubVersion)2009-11-23 15:45 27014人阅读 评论(12) 收藏 举报 svnsubversion服务器文档工作c 版本冲突原因: ...

  4. 【转】svn冲突问题详解 SVN版本冲突解决详解

    (摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲 ...

  5. svn冲突问题详解 SVN版本冲突解决详解

    svn冲突问题详解 SVN版本冲突解决详解 (摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svn ...

  6. .Net Framework项目引用.NetStandard标准库出现版本冲突解决办法

    今天在工作中出现一个引用问题,害我找问题找了很久.起因是在一个Winform项目下需要引用一个.NetStandard标准库,标准库引用了System.ComponentModel.Annotatio ...

  7. Newtonsoft.Json 版本冲突解决

    在做asp.net MVC 开发时,因为引用的dll 中使用了更高版本的 Newtonsoft.Json ,导致运行时发生错误, 查资料说是因为webApi使用了Newtonsoft.Json 导致了 ...

  8. SVN版本冲突解决

    解决冲突有三种选择: A.放弃自己的更新,使用svn revert(回滚),然后提交.在这种方式下不需要使用svn resolved(解决) B.放弃自己的更新,使用别人的更新.使用最新获取的版本覆盖 ...

  9. 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 ...

随机推荐

  1. 【Win 10应用开发】实现全屏播放的方法

    有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整 ...

  2. WPF开发查询加班小工具

    先说一下,我们公司是六点下班,超过7点开始算加班,但是加班的时间是从六点开始计算,以0.5个小时为计数,就是你到了六点半,不算加班半小时,但是加班到七点半,就是加班了一个半小时. 一.打卡记录 首先, ...

  3. Tomcat报java.lang.OutOfMemoryError: Java heap space错误停止运行如何解决

    最近开发的一个商业项目,部署完成后,经常出现Tomcat挂掉的现象,报的异常是:java.lang.OutOfMemoryError: Java heap space,上网google了一下,了解了一 ...

  4. 搞清arguments,callee,caller

    arguments是什么? arguments是函数调用时,创建的一个类似的数组但又不是数组的对象,并且它存储的是实际传递给函数的参数,并不局限于函数声明的参数列表哦. 尼玛,什么意思? 写个demo ...

  5. canvas的用法介绍

    目录 概述 绘图方法 图像处理方法 drawImage方法 getImageData方法,putImageData方法 toDataURL方法 save方法,restore方法 动画 像素处理 灰度效 ...

  6. php通过判断来源主机头进行防盗链

    check.php <html> <body> <form action="test.php" method="post"> ...

  7. 使用SPIRE.XLS来创建Excel 工作簿

               使用SPIRE.XLS来创建Excel 工作簿     概要 最近在研究 .NET 控件,使用这些控件在程序中可以快速低成本实现功能. 在这一篇中我们使用的控件是Spire.XL ...

  8. UIScrollView的delaysContentTouches与canCencelContentTouches属性

    UIScrollView有一个BOOL类型的tracking属性,用来返回用户是否已经触及内容并打算开始滚动,我们从这个属性开始探究UIScrollView的工作原理: 当手指触摸到UIScrollV ...

  9. 制作动画或小游戏——CreateJS事件(二)

    在Canvas中如果要添加事件,就需要计算坐标来模拟各种事件,而EaselJS中已经封装好了多个事件,只需调用即可. 一.事件 1)点击 事件是绑定在Shape类中的,click事件与DOM中的意思是 ...

  10. 关于Java中的transient关键字

    Java中的transient关键字是在序列化时候用的,如果用transient修饰变量,那么该变量不会被序列化. 下面的例子中创建了一个Student类,有三个成员变量:id,name,age.ag ...