先说一说整个经历。
因为之前没有注意到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,之前真没注意到这个问题,后来通过回忆整个过程才猜想是不是这个原因,然后试了试终于成功了。