zoukankan      html  css  js  c++  java
  • 解决CentOS下boost安装后不能使用的问题

      先说一说整个经历。

      因为之前没有注意到gcc4.8.5比较旧,就已经安装好boost了,当时已经可以使用了,后来发现gcc太老了,一些软件安装需要比较新的gcc支持,所以决定升级gcc,结果boost就不能用了,然后重新编译(这时我注意到用的是新版的gcc编译的),结果还是不能用。于是选择卸载掉重新安装,结果发现这时用的是旧版gcc编译,中途中断过许多次,重装过许多次,发现都是用的gcc-4.8.5编译的,使用

    --with-toolset=gcc-8.1.0
    

      指定版本编译,但却说找不到工具,无奈,最后还是将就了用gcc-4.8.5编译的。

      关于这个问题,其实我也不是太明白,升级gcc的时候肯定会用到sudo权限来编译新版的gcc(因为有一些系统文件的读写需要权限,不然不可能能编译成功才对),经过编译、安装等等,并将libstdc++.so.6指向新版的后,就会更新为新版的gcc,这时我认为系统默认应该使用新版的gcc才对,而且旧版本的gcc也是sudo权限才对。但这个问题暂时先不管了。

      为什么发现是使用旧版gcc编译就重装boost许多次的原因是因为无论怎样boost都不能用,所以怀疑是不是因为使用了旧gcc编译的原因,当然测试代码是肯定没有问题的:

    #include <iostream>
    #include <boost/regex.hpp>
    #include <string>
    
    using std::string;
    
    int main()
    {
    	string url = "https://www.baidu.com/";
    	boost::regex re("((https?)://)?");
    	boost::smatch host;
    	if (boost::regex_search(url, host, re))
    	{
    		std::cout << host.str() << std::endl;
    	}
    	std::cout << "bye!" << std::endl;
    	return 0;
    }
    

      编译:

    $ g++ test.cpp -lboost_regex -o test

      报错:

    /tmp/ccLrk6JG.o:在函数‘bool boost::regex_search<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >)’中:
    test.cpp:(.text._ZN5boost12regex_searchIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISB_EEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEbT_SJ_RNS_13match_resultsISJ_T0_EERKNS_11basic_regexIT1_T2_EENS_15regex_constants12_match_flagsESJ_[_ZN5boost12regex_searchIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISB_EEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEEbT_SJ_RNS_13match_resultsISJ_T0_EERKNS_11basic_regexIT1_T2_EENS_15regex_constants12_match_flagsESJ_]+0xab):对‘boost::re_detail_106700::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find()’未定义的引用
    /tmp/ccLrk6JG.o:在函数‘boost::re_detail_106700::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::perl_matcher(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >)’中:
    test.cpp:(.text._ZN5boost16re_detail_10670012perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISC_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEC2ESC_SC_RNS_13match_resultsISC_SF_EERKNS_11basic_regexIcSJ_EENS_15regex_constants12_match_flagsESC_[_ZN5boost16re_detail_10670012perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISC_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEEC5ESC_SC_RNS_13match_resultsISC_SF_EERKNS_11basic_regexIcSJ_EENS_15regex_constants12_match_flagsESC_]+0x121):对‘boost::re_detail_106700::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)’未定义的引用
    

      出现这个问题的原因是因为找不到boost_search()等的相关动态链接库,但之前没升级gcc时的boost使用经验告诉我只要在编译命令中加上

    -lboost_regex
    

      就可以了,然而现在我加上了也提示找不到,就说明肯定是boost库的问题,但为什么会找不到呢?难道还需要把什么动态库和什么东西链接起来吗,而且我已经把她的动态库添加到PATH中了,不可能找不到才对。。。

      下面就是关键的地方了。

      注意:前面提到的编译boost时正常显示时新版本gcc编译的那一次我并没有用sudo,而我之后编译boost的时候都是用的sudo权限编译的,这就是为什么后来的boost编译都时使用的旧版本gcc编译的原因。然后注意都是使用的sudo权限来编译boost,也就是说是这样的:

    $ sudo ./bootstrap.sh --prefix=/usr/local
    $ sudo ./b2
    $ cd tools/build
    $ sudo ./bootstrap.sh
    $ sudo ./b2 --prefix=/usr/local
    

      所以,boost库是有权限的...

      也就是说,你用gcc编译的时候也要加上sudo才能编译成功:

    $ sudo g++ test.cpp -lboost_regex -o test
    [sudo] darkchii 的密码:
    $ ./test
    https://
    bye!

      就成功了。连生成的文件都是带权限的:

      emmm,之前真没注意到这个问题,后来通过回忆整个过程才猜想是不是这个原因,然后试了试终于成功了。

  • 相关阅读:
    3、Spring Cloud Rest工程创建(通过IDEA创建)
    Centos7配置阿里epel源|yum源
    OSI七层模型:TCP/IP && HTTP && WebSocket && MQTT
    几种进程间的通信方式
    Tomcat类加载机制
    JAVA类加载器
    Spring事务隔离级别
    Spring事务传播特性
    Spring事务实现原理
    RPC框架Dubbo分析
  • 原文地址:https://www.cnblogs.com/darkchii/p/9065206.html
Copyright © 2011-2022 走看看