2016-02-13 26 views
5

Tôi đang sử dụng Ubuntu 14.04, sử dụng CMake và CLion. Tôi cố gắng để sử dụng chương trình Options, với đoạn mã sau lấy từ một ví dụ trong tài liệu hướng dẫn của họ:Tăng Program_Options ném "chuyển đổi ký tự thất bại"

#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"; 
    } 
} 

Khi tôi chạy nó, tôi nhận được kết quả sau từ nhà ga:

$ ./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) 

Tại sao mà không làm việc và làm thế nào tôi có thể giải quyết nó?

EDIT: Sau khi gỡ lỗi, tôi thấy rằng sự cố xuất phát từ dòng với store, nếu đây là bất kỳ trợ giúp nào cho bạn. Ngoài ra, tôi có đề cập đến tôi đã cố gắng sử dụng store(..., true) (thiết unicode để true)

+0

Không có lỗi đối với tôi khi sử dụng g ++ 4.9.2 và Tăng 1.55. – rhashimoto

+0

Tôi đang sử dụng Boost 1.60.0 – Victor

Trả lời

4

Tôi đã gặp sự cố tương tự khi chuyển từ 1.58 sang 1.61.
Vấn đề của tôi là tôi đang liên kết 1.61 mã tiêu đề tăng với các thư viện được chia sẻ cũ 1.58.

Bạn có thể đã cài đặt phiên bản mới hơn của tăng, nhưng điều đó không có nghĩa là bạn vẫn không liên kết với các thư viện tăng cũ. Kiểm tra mối liên kết của bạn. Kiểm tra các tệp hệ thống của bạn.
Một kiểm tra tốt mà bạn có thể thực hiện trên chương trình của mình, là chạy nó qua gdb, gặp sự cố và xem backtrace (bt). Nó sẽ hiển thị số phiên bản tăng trong backtrace. Xem nếu nó phù hợp với những gì bạn mong đợi.

Bạn đã đề cập đến Ubuntu và đó cũng là những gì tôi đang làm. Tôi đã xây dựng tăng cường từ nguồn như vậy:

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

Điều này dẫn đến tệp thư viện của tôi được đặt tại /usr/lib/libboost*.
Tuy nhiên, người liên kết của tôi đang tìm kiếm trong /usr/lib/x86_64-linux-gnu/libboost*.

Một đơn giản cp -Pf trên các tệp cũ đã giải quyết được sự cố của tôi.

1

Tôi đã gặp phải vấn đề chính xác cùng với một mảnh rất giống mã trong khi sử dụng Chương trình Tùy chọn thư viện (phiên bản 1,58 trong trường hợp của tôi).

Giải pháp của tôi chỉ đơn giản là cài đặt lại Boost (cùng phiên bản) và sự cố đã được giải quyết mà không cần bất kỳ sửa đổi mã hoặc thay đổi hệ thống nào khác.

Tóm lại, sự cố này dường như không liên quan trực tiếp đến thư viện Boost, nhưng có vẻ là do cài đặt Tăng cường của hệ thống. SO question điểm khác cho một vấn đề tương tự, và theo các ý kiến ​​chỉ cần cài đặt lại sạch cùng phiên bản Boost (1,60 trong trường hợp của họ) cũng đã thành công.

Hy vọng điều này có thể giúp ai đó!

-1

Tôi có vấn đề này quá, cuối cùng tôi tìm thấy nguyên nhân gốc rễ của vấn đề của tôi, có lẽ nó sẽ giúp cho bạn,

khi gdb các tập tin cốt lõi, nó cho thấy như thế này

#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 

tôi thấy nó sử dụng hệ thống bao gồm tệp khi tôi biên dịch tệp exe, nhưng nó liên kết tệp boost.a không phải là phiên bản tương tự như tăng hệ thống. thật ngạc nhiên. khi tôi loại bỏ hệ thống tăng, tất cả là ok!

Các vấn đề liên quan