2016-02-13 112 views
5

我在Ubuntu 14.04上使用CMake和CLion。我試圖使用程序選項,從一個實例在其文檔中採取了以下代碼:Boost Program_Options拋出「字符轉換失敗」

#include <iostream> 
#include <boost/program_options.hpp> 

int main(int ac, char* av[]) { 
    namespace po = boost::program_options; 
    using namespace std; 

    po::options_description desc("Allowed options"); 
    desc.add_options() 
      ("help", "produce help message") 
      ("compression", po::value<int>(), "set compression level") 
      ; 

    po::variables_map vm; 
    po::store(po::parse_command_line(ac, av, desc), vm); 
    po::notify(vm); 

    if (vm.count("help")) { 
     cout << desc << "\n"; 
     return 1; 
    } 

    if (vm.count("compression")) { 
     cout << "Compression level was set to " 
     << vm["compression"].as<int>() << ".\n"; 
    } else { 
     cout << "Compression level was not set.\n"; 
    } 
} 

當我運行它,我從終端輸出如下:

$ ./bin/webserver --help 
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::logic_error> >' 
    what(): character conversion failed 
Aborted (core dumped) 

爲什麼不工作,我該如何解決它?

編輯:經過一些調試後,我發現問題來自store行,如果這對你有任何幫助。此外,我不得不提到我嘗試使用store(..., true)(設置unicodetrue

+0

對於使用g ++ 4.9.2和Boost 1.55的我來說沒有錯誤。 – rhashimoto

+0

我正在使用Boost 1.60.0 – Victor

回答

4

我遇到了從1.58過渡到1.61的完全相同的問題。
我的問題是我連接1.61助推頭代碼與舊的1.58共享庫。

您可能已經安裝了更新版本的boost,但這並不意味着您仍然沒有鏈接舊的boost庫。檢查你的鏈接器。檢查你的系統文件。
你可以在你的程序上做一個很好的檢查,就是通過gdb運行它,讓它崩潰,然後看看回溯(bt)。它會在回溯中顯示增強版本號。看看它是否符合你的預期。

你提到過Ubuntu,這也是我所關注的。我內置的升壓源像這樣:

sudo ./bootstrap.sh --prefix=/usr 
sudo ./b2 install threading=multi link=shared 

這導致我的庫文件被位於/usr/lib/libboost*
但是,我的鏈接器正在尋找/usr/lib/x86_64-linux-gnu/libboost*

舊文件的簡單cp -Pf解決了我的問題。

1

我遇到了非常相似的一段代碼完全相同的問題,同時使用程序選項庫(版本1.58在我的情況)。

我的解決方案是簡單地重新安裝升壓(相同版本),並且問題解決了沒有任何其他代碼修改或系統更改。

總之,這個問題似乎並不直接與Boost庫相關,但似乎是由於系統的Boost安裝。另一個SO question指出了一個類似的問題,根據評論,乾淨地重新安裝相同版本的Boost(他們的案例爲1.60)也是成功的。

希望這可以幫助別人!

-1

我有這樣的問題太多,我終於找到我的問題的根本原因,也許它會幫助你,

的gdb的核心文件時

,它顯示了這樣

#4 0x0000000000409ad6 in boost::detail::sp_counted_base::release (this=0x2669970) 
    at /usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:146 
#5 0x0000000000411914 in ~shared_count (this=0x266a0d8, __in_chrg=<optimized out>) 
    at /usr/include/boost/smart_ptr/detail/shared_count.hpp:371 
#6 ~shared_ptr (this=0x266a0d0, __in_chrg=<optimized out>) at /usr/include/boost/smart_ptr/shared_ptr.hpp:328 
#7 _Destroy<boost::shared_ptr<boost::program_options::option_description> > (__pointer=0x266a0d0) 
    at /usr/include/c++/4.8.2/bits/stl_construct.h:93 
#8 __destroy<boost::shared_ptr<boost::program_options::option_description>*> (__last=<optimized out>, 
    __first=0x266a0d0) at /usr/include/c++/4.8.2/bits/stl_construct.h:103 
#9 _Destroy<boost::shared_ptr<boost::program_options::option_description>*> (__last=<optimized out>, 
    __first=<optimized out>) at /usr/include/c++/4.8.2/bits/stl_construct.h:126 

我發現它當我編譯exe文件時,使用系統包含文件,但它會鏈接與系統boost不同的boost.a文件。它很驚訝。當我刪除系統提升,一切都好!

相關問題