Boost Program_Options抛出"字符转换失败"

时间:2016-02-13 17:20:38

标签: c++ boost boost-program-options

我在Ubuntu 14.04,使用CMake和CLion。我正在尝试使用程序选项,以下代码取自其文档中的示例:

#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)

为什么这不起作用,我该如何解决?

编辑:经过一些调试后,我发现问题来自store行,如果这对你有任何帮助的话。另外,我必须提到我尝试使用store(..., true)(将unicode设置为true

3 个答案:

答案 0 :(得分:5)

我遇到了从1.58过渡到1.61的完全相同的问题 我的问题是我将1.61 boost标头代码与旧的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解决了我的问题。

答案 1 :(得分:1)

在使用程序选项库(在我的情况下为1.58版)时,我遇到了与非常相似的代码完全相同的问题。

我的解决方案只是重新安装Boost (相同版本),问题解决了,没有任何其他代码修改或系统更改。

总而言之,这个问题似乎并没有直接与Boost库相关,但似乎是由于系统的Boost安装。另一个SO question指向类似的问题,根据评论,只是干净地重新安装相同版本的Boost(在他们的情况下为1.60)也是成功的。

希望这可以帮助别人!

答案 2 :(得分:-1)

我也有这个问题,最后我找到了问题的根本原因,也许这对你有帮助,

当gdb是核心文件时,它就像这样显示

#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文件与system boost版本不同。令人惊讶的是。当我删除系统提升时,一切正常!