c++ - boost::program_options 总是用空值解析命令行

标签 c++ boost

在 debian stretch 和 gcc 6.4.0 上,boost 1.66.0

boost::program_options 总是用空值解析命令行。 代码如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <boost/filesystem.hpp>
#include <boost/program_options.hpp>

int main(int argc, char* argv[])
{
    using namespace boost::program_options;
    options_description desc{"Options"};
    desc.add_options()
            ("help,h", "Help screen")
            ("target,t", value<std::string>()->required(), "Set the target.");
    command_line_parser parser{argc, argv};
    parser.options(desc).allow_unregistered().style(command_line_style::default_style | command_line_style::allow_slash_for_short);
    parsed_options parsed_options = parser.run();
    variables_map vm;
    store(parsed_options, vm);
    notify(vm);
    if (vm.count("help"))
    {
        std::cout << desc << std::endl;
        return -1;
    }

    if (vm["target"].empty())
    {
        std::cout << "Error: empty" << std::endl;
        return -1;
    }

    if (vm.count("target"))
    {
        std::string target = vm["target"].as<std::string>();
        std::cout << target << std::endl;
        return -1;
    }
    return 0;
}

然后编译运行

./foo --target start

并且 vm["target"].empty() 总是 TRUE。为什么??

最佳答案

我只能猜测您运行的二进制文件有误。

Live On Coliru

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <boost/filesystem.hpp>
#include <boost/program_options.hpp>

int main(int argc, char* argv[])
{
    using namespace boost::program_options;
    options_description desc{"Options"};
    desc.add_options()
            ("help,h", "Help screen")
            ("target,t", value<std::string>()->required(), "Set the target.");

    command_line_parser parser{argc, argv};
    parser.options(desc).allow_unregistered().style(command_line_style::default_style | command_line_style::allow_slash_for_short);
    parsed_options parsed_options = parser.run();
    variables_map vm;
    store(parsed_options, vm);
    notify(vm);

    if (vm.count("help"))
    {
        std::cout << desc << std::endl;
        return -1;
    }

    if (vm["target"].empty())
    {
        std::cout << "Error: empty" << std::endl;
        return -1;
    }

    if (vm.count("target"))
    {
        std::string target = vm["target"].as<std::string>();
        std::cout << target << std::endl;
        return -1;
    }
    return 0;
}

./a.out --target HELLOWORLD 的打印:

HELLOWORLD

关于c++ - boost::program_options 总是用空值解析命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48436551/

相关文章:

c++ - 带有 C++ 解决方案的 C 库

c++ - 在 Try/Catch 处理程序中获取 pContext?

c++ - 编译时系数和值序列的内积

c++ - 为什么在 C++ 函数 boost::algorithm::join_if 中抛出 std::bad_cast 异常?

C++ 建立链接步骤 : Undefined symbols for architecture x86_64

c++ - Boost 1.65.1 中可能存在错误。在运行 bootstrap.bat gcc 时

c++ - boost 模拟 C# 的 IEnumerable 的方式?

c++如何创建相互依赖的类

c++ - Excel 互操作 C++ : Workbook SaveAs exception - Code 0x800A03EC

linux - 没有可用的 boost 线程?