提升 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.58
到 1.61
。
我的问题是我将 1.61
boost header 代码与旧的 1.58
共享库链接起来。
您可能已经安装了较新版本的 boost,但这并不意味着您仍然没有与旧的 boost 库链接。检查你的链接器。检查您的系统文件。
你可以对你的程序做一个很好的检查,就是运行它到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的版本不同。它很惊讶。当我删除系统提升时,一切正常!
我在 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.58
到 1.61
。
我的问题是我将 1.61
boost header 代码与旧的 1.58
共享库链接起来。
您可能已经安装了较新版本的 boost,但这并不意味着您仍然没有与旧的 boost 库链接。检查你的链接器。检查您的系统文件。
你可以对你的程序做一个很好的检查,就是运行它到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的版本不同。它很惊讶。当我删除系统提升时,一切正常!