2016-05-19 7 views
0

私はプログラムオプションを正しく動作させるために苦労しています。私は、ターミナルウィンドウ(Linux)から値をとるオプションの引数を使って自分のプログラムを起動できる必要があります。私が何をしても、これはうまくいかないでしょう。私は端末からどのような値を入力しても、デフォルト値を返しただけです。さらに、私は私のterminaコマンドでオプションが含まれていなかったならば、それはC++のプログラムオプションを常にデフォルト値に設定する

terminate called after throwing an instance of  'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injec tor<std::logic_error> >'                                     
what(): character conversion failed                            
Aborted (core dumped) 

で返されたので、私はそれが私が間違って行っていたものだったかどうかを確認するために、インターネット上で最小限の例を見つけました。

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

namespace po = boost::program_options; 

int main (int argc, char* argv[]) { 

po::options_description desc("Usage"); 
desc.add_options() 
    ("robots", po::value<int>()->default_value(3), 
"How many robots do you want to send on a murderous rampage?"); 

po::variables_map opts; 
po::store(po::parse_command_line(argc, argv, desc), opts); 

try { 
    po::notify(opts); 
} 
catch (std::exception& e) { 
    std::cerr << "Error: " << e.what() << "\n"; 
    return 1; 
} 

int nRobots = opts["robots"].as<int>(); 
// automatically assigns default when option not supplied by user!! 

std::cout << nRobots << " robots have begun the silicon revolution" 
    << std::endl; 
return 0; 
} 

しかしこれはまったく同じことをして、私はこれはブーストのバグ(そう、私は推測する)か何かのどちらかだと思うし始めています:ここで私はそれは私が必要とする同様のことをした例がありますそれが好きではない私のシステムについて?

誰かが間違っているかもしれない何かをヒントできますか?ありがとう

+1

これは私のために正しく動作します。再現可能な例が実際に*問題のエラーを再現することを確認してください。 – nrussell

+1

あなたのコードはここにあります(http://coliru.stacked-crooked.com/a/8b1c8b420b7e58a2)。 – chris

+0

@nrussell 私の記事で述べたように、そのコードは自分のマシン上でエラーを再現し、私のバージョンのBoost(v1.60)や私のシステム上のバグだと思われます。少なくとも今はコードが動作することを知っています、ありがとうございます。 – ppyvabw

答えて

0

私は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が私の問題を解決しました。

関連する問題