boost::program_options работает с -p, но не --param

Я использую boost::program_options для разбора argv. Я ожидаю и -c, и --config

  boost::program_options::options_description description("Utility");
  description.add_options()
    ("help,h", "display this message")
    ("config,c", boost::program_options::value<std::string>(), "Path to configuration file")
    ("config-type", boost::program_options::value<std::string>()->default_value("json"), "type of configuration file (json|xml)")
    ("verbose,v", boost::program_options::value<int>()->default_value(2), "verbosity(0 to 2)")
    ("thread,t",boost::program_options::value<int>()->default_value(0), (boost::format("Max Thread Count %1% to %2%(Processor cores of this machine) if not multi threaded") % 0 % boost::thread::hardware_concurrency()).str().c_str())
    ("action,a", boost::program_options::value<std::string>()->default_value("pack"), "action to perfoem (pack|unpack)");
  boost::program_options::positional_options_description positional_description;
  positional_description.add("action", -1);

  boost::program_options::variables_map var_map;
  boost::program_options::store(boost::program_options::command_line_parser(argc, argv).options(description).positional(positional_description).style(boost::program_options::command_line_style::unix_style).run(), var_map);
  boost::program_options::notify(var_map);

  if(var_map.count("help")){
    std::cout << description;
    return 1;
  }
  if(var_map.count("config") < 1){
    std::cout << "No Configuration file added" << std::endl;
    return 1;
  }

  if(var_map.count("action") < 1){
    std::cout << "Please specify an action to perfoem (pack|unpack)" << std::endl;
    return 1;
  }

но --config f или --config=f или --config="f" не работает и печатает No Configuration file added, хотя -c f работает.
также, если я использую --config без каких-либо аргументов, выдается исключение, говорящее required parameter is missing in 'config-type', у которого уже есть параметр по умолчанию.


person Neel Basu    schedule 03.08.2012    source источник
comment
Длинные параметры используют формат --option=value, IIRC.   -  person Xeo    schedule 03.08.2012
comment
Я тоже пробовал это. что тоже не сработало   -  person Neel Basu    schedule 03.08.2012
comment
Ваш код работает, как и ожидалось, в VC10 как с --config=f, так и с -c f   -  person Praetorian    schedule 03.08.2012
comment
Я использую ubuntu с boost 1.42, а в репозитории ubuntu нет более высокой версии. а 1.42 так глючит? Я так не думаю. Я пропал где-то еще?   -  person Neel Basu    schedule 03.08.2012
comment
Просто скачайте исходный код Boost и соберите его самостоятельно, это не сложно.   -  person Xeo    schedule 03.08.2012


Ответы (1)


Ваша проблема выглядит точно так же, как описано здесь: boost::program_options - выполняет ли он точное сопоставление строк для параметров командной строки?

Я использую Ubuntu с Boost 1.42, а в репозитории Ubuntu нет более высокой версии. а 1.42 такая глючная?

да.

Вы можете обойти проблему, поменяв местами спецификации --config и --config-type.

Более чистое решение — обновить Boost. Владимир Прус в упомянутом ответе SO говорит, что ошибка исправлена ​​​​в версии 1.45. Из того, что вы написали, я предполагаю, что вы используете Ubuntu 11.04 (Natty Narwhal). Вы можете сделать одно из следующих действий:

  1. Установите более новые пакеты Boost из Ubuntu 11.10 (Boost 1.46) или Ubuntu 12.04 (Boost 1.48) — временно заменив natty на oneiric или точно на 11.10 или 12.04 соответственно в /etc/apt/sources.list.
  2. Установите более новые пакеты Boost и PPA, которые содержат бэкпорты Boost (например, https://launchpad.net/~purplekarrot/+archive/ppa)
  3. Соберите Boost из исходников, как предложил Xeo.
person Michał Wróbel    schedule 19.08.2012
comment
Да, это сработало, когда я переименовал config-type в format. Я искал такой отчет об ошибке. - person Neel Basu; 20.08.2012