提升 Program_Options 抛出 "character conversion failed"

Boost Program_Options throws "character conversion failed"

我在 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

我在使用 Program Options 库(在我的例子中是 1.58 版)时遇到了完全相同的问题和一段非常相似的代码。

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

综上所述,这个问题似乎与Boost库没有直接关系,但似乎是由于系统安装了Boost。另一个 SO question 指出了类似的问题,根据评论,完全重新安装相同版本的 Boost(在他们的情况下是 1.60)也成功了。

希望这可以帮助到别人!

我 运行 遇到完全相同的问题 t运行 从 1.581.61
我的问题是我将 1.61 boost header 代码与旧的 1.58 共享库链接起来。

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

您提到了 Ubuntu,这也是我所关注的。我像这样从源代码构建了 boost:

sudo ./bootstrap.sh --prefix=/usr
sudo ./b2 install threading=multi link=shared

这导致我的库文件位于 /usr/lib/libboost*
但是,我的链接器正在查找 /usr/lib/x86_64-linux-gnu/libboost*

对旧文件的简单 cp -Pf 解决了我的问题。

我也有这个问题,终于找到问题的根源,也许对你有帮助,

当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文件时使用了系统包含文件,但它link boost.a 文件与系统boost的版本不同。它很惊讶。当我删除系统提升时,一切正常!