2016-02-13 9 views
5

मैं सीएमके और क्लियन का उपयोग करते हुए उबंटू 14.04 पर हूं। मैं, कार्यक्रम विकल्प का उपयोग करने के कोशिश कर रहा हूँ अपने दस्तावेज में एक उदाहरण से लिया निम्न कोड के साथ:बूस्ट प्रोग्राम_ऑप्शन फेंकता है "चरित्र रूपांतरण विफल"

#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) उपयोग करने की कोशिश (true को unicode की स्थापना)

+0

g ++ 4.9.2 और बूस्ट 1.55 का उपयोग करके मेरे लिए कोई त्रुटि नहीं है। – rhashimoto

+0

मैं बूस्ट 1.60.0 – Victor

+0

का उपयोग कर रहा हूं मुझे डिजिटलऑअन क्लीन वीएम पर एक ही समस्या है। तो मुझे लगता है कि बूस्ट या मेरे संकलन के साथ कोई समस्या है .... लेकिन मुझे नहीं पता कि इन सिद्धांतों का परीक्षण कैसे करें। – Victor

उत्तर

4

मैं 1.58 से 1.61 पर संक्रमण के समान समस्या में भाग गया।
मेरी समस्या यह थी कि मैं पुराने 1.58 साझा पुस्तकालयों के साथ 1.61 बूस्ट हेडर कोड लिंक कर रहा था।

आपने बूस्ट का एक नया संस्करण स्थापित किया हो सकता है, लेकिन इसका मतलब यह नहीं है कि आप अभी भी पुरानी बूस्ट लाइब्रेरी से लिंक नहीं कर रहे हैं। अपने लिंकर की जांच करें। अपनी सिस्टम फाइलों की जांच करें।
एक अच्छा चेक जो आप अपने प्रोग्राम पर कर सकते हैं, इसे gdb के माध्यम से चलाने के लिए है, इसे क्रैश करें, और बैकट्रैक (बीटी) देखें। यह बैकट्रैस में बूस्ट वर्जन नंबर दिखाएगा। देखें कि यह आपके द्वारा अपेक्षित चीज़ों से मेल खाता है या नहीं।

आपने उबंटू का उल्लेख किया है, और यही वह है जो मैं भी हूं। मैं तो जैसे स्रोत से बढ़ावा बनाया:

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.58) कार्यक्रम विकल्प पुस्तकालय का उपयोग करते समय उल्लेख करना होगा।

मेरा समाधान बस बूस्ट (समान संस्करण) को पुनर्स्थापित करना था, और समस्या को किसी भी अन्य कोड संशोधन या सिस्टम परिवर्तनों के बिना हल किया गया था।

समेकित करने के लिए, यह समस्या सीधे बूस्ट पुस्तकालयों से संबंधित प्रतीत नहीं होती है, लेकिन ऐसा लगता है कि सिस्टम की बूस्ट स्थापना के कारण है। एक और SO question एक समान मुद्दे पर इंगित करता है, और टिप्पणियों के अनुसार बस बूस्ट के उसी संस्करण को स्वचालित रूप से पुनर्स्थापित करना (उनके मामले में 1.60) भी सफल रहा।

उम्मीद है कि यह किसी की मदद कर सकता है!

-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 फ़ाइल को लिंक करता है जो सिस्टम बूस्ट के समान संस्करण नहीं है। यह सुप्रसिद्ध है। जब मैं सिस्टम बूस्ट को हटा देता हूं, तो ठीक है!

संबंधित मुद्दे