zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    Tensorflow
    EM算法
    神经网络 CNN
    神经网络总结(tensorflow)
    Chrome扩展程序和油猴推荐
    机器学习(贝叶斯,K-means,ROC,AUC)
    机器学习随笔(决策树,集成算法,交叉验证)
    机器学习随笔(线性回归,逻辑回归原理)
    @PropertySource加载文件的两种用法以及配置文件加载顺序
    JNDI(Java Naming and Directory Interface )
  • 原文地址:https://www.cnblogs.com/2018/p/3914590.html
Copyright © 2011-2022 走看看