我在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
)
答案 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版本不同。令人惊讶的是。当我删除系统提升时,一切正常!