1. 程式人生 > >解決CentOS下boost安裝後不能使用的問題

解決CentOS下boost安裝後不能使用的問題

升級gcc 權限 oot 相關 highlight 中斷 flag clr 密碼

  先說一說整個經歷。

  因為之前沒有註意到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安裝後不能使用的問題