【问题标题】:c++ boost program options always giving default valuec ++ boost程序选项总是给出默认值
【发布时间】:2016-05-19 18:57:50
【问题描述】:

我正在努力让增强程序选项正常工作。我需要能够使用带有值的可选参数从终端窗口 (Linux) 启动我的程序。无论我做什么,这都行不通;无论我从终端输入什么值,它都只返回默认值。此外,如果我没有在终端命令中包含该选项,它会返回

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;
} 

然而,这完全一样,我开始认为这要么是 Boost 中的错误(我猜不太可能),要么是我的系统不喜欢的东西?

有人可以提示一下可能出了什么问题吗?谢谢

【问题讨论】:

  • 这对我来说是正确的。请确保您的可重现示例确实重现有问题的错误。
  • 你的代码works here
  • @nrussell 正如我在帖子中所说,该代码确实在我的机器上重现了该错误,并且怀疑这是我的 Boost (v1.60) 版本或我的系统上的某个错误。至少现在我知道代码确实有效,谢谢。
  • 您使用的是哪个版本的 Boost,您使用什么命令编译程序?
  • @nrussell 使用 v1.60。它编译得很好,但我正在编译的命令是:g++ popt_test.cpp -lboost_program_options

标签: c++ boost-program-options


【解决方案1】:

我在从 1.58 转换到 1.61 时遇到了完全相同的问题。
我的问题是我将1.61 boost 标头代码与旧的1.58 共享库链接。

您可能已经安装了较新版本的 boost,但这并不意味着您仍然没有与旧的 bo​​ost 库链接。检查您的链接器。检查您的系统文件。
您可以对您的程序进行的一个很好的检查是通过gdb 运行它,让它崩溃,然后查看回溯(bt)。它将在回溯中显示 boost 版本号。看看它是否符合您的预期。

如果相关,我在 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 覆盖旧文件解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2014-12-13
    • 2014-10-11
    相关资源
    最近更新 更多