2016-02-13 9 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) 

のはなぜですそれは働かないと私はそれをどのように解決することができますか?

EDIT:いくつかのデバッグした後、私は、これはあなたのための任意のヘルプのであれば、問題は、storeとラインから来ることがわかりました。また、私は(私の場合には、バージョン1.58)プログラムオプションライブラリを使用している間、私は、コードの非常に類似した作品とまったく同じ問題に遭遇した

+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について言及しましたが、これも私の話です。私はそうのようなソースからの後押しを建て:これは私のライブラリファイルが/usr/lib/libboost*に位置することになった

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


しかし、私のリンカーは/usr/lib/x86_64-linux-gnu/libboost*を探していました。

古いファイルの上の単純なcp -Pfが私の問題を解決しました。コアファイルをgdbをするとき

1

trueunicode設定)store(..., true)を使用してみました言及する必要があります。

私の解決策は、単にブースト(同じバージョン)を再インストールし、他のコードの変更やシステムの変更なしで問題を解決したことです。

要約すると、この問題はBoostライブラリとは直接関係していないようですが、システムのBoostのインストールによるものと思われます。もう1つのSO questionは同様の問題を指摘しています。コメントによれば、同じバージョンのBoost(ケースでは1.60)をきれいに再インストールするだけで成功しました。

これは誰かを助けることを願っています!

-1

私もこの問題を抱えているが、最終的に私は私の問題の根本原因を見つけ、多分それは希望あなたのために役立ち、

、それはこの

#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.aファイルをリンクします。それは驚いた。私はシステムのブーストを削除すると、すべてが大丈夫です!

関連する問題