解決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,之前真沒註意到這個問題,後來通過回憶整個過程才猜想是不是這個原因,然後試了試終於成功了。
解決CentOS下boost安裝後不能使用的問題