2016-02-13 9 views
5

Ich bin auf Ubuntu 14.04, mit CMake und CLion. Ich versuche, von einem Beispiel in ihrer Dokumentation genommen Programmoptionen, mit dem folgenden Code zu verwenden:Boost Program_Options wirft "Zeichenumwandlung fehlgeschlagen"

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

Wenn ich es laufen, bekomme ich die folgende Ausgabe aus der Klemme:

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

Warum ist das funktioniert nicht und wie kann ich es lösen?

EDIT: Nach einigen Debugging, habe ich festgestellt, dass das Problem von der Linie mit store kommt, wenn dies für Sie eine Hilfe ist. Auch muß ich erwähne ich versuchte store(..., true) mit

+0

Kein Fehler für mich mit g ++ 4.9.2 und Boost 1.55. – rhashimoto

+0

Ich verwende Boost 1.60.0 – Victor

Antwort

4

Ich lief in genau das gleiche Problem Übergang von 1.58 zu 1.61.
Mein Problem war, dass ich 1.61 Boost-Header-Code mit alten gemeinsamen Bibliotheken 1.58 verknüpfte.

Sie haben möglicherweise eine neuere Boost-Version installiert, aber das bedeutet nicht, dass Sie immer noch nicht mit alten Boost-Bibliotheken verlinken. Überprüfen Sie Ihren Linker. Überprüfen Sie Ihre Systemdateien.
Ein guter Check, den Sie in Ihrem Programm machen können, ist es, es durch gdb laufen zu lassen, es zu crashen, und schauen Sie sich die Backtrace (BT) an. Es zeigt die Boost-Versionsnummern im Backtrace an. Sehen Sie, ob es Ihren Erwartungen entspricht.

Sie erwähnten Ubuntu, und darauf bin ich auch. Ich baute Schub von Quelle wie folgt:

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

Diese in meiner Bibliothek Dateien in Folge bei /usr/lib/libboost* befindet.
Allerdings suchte mein Linker in /usr/lib/x86_64-linux-gnu/libboost*.

Ein einfaches cp -Pf über die alten Dateien löste mein Problem.

1

(unicode zu true Einstellung) Ich war genau die gleiche Problem mit einem sehr ähnlichen Stück Code zu stoßen, während Sie die Programmoptionen Bibliothek (Version 1.58 in meinem Fall).

Meine Lösung war einfach Boost (gleiche Version) neu zu installieren, und das Problem wurde ohne weitere Codeänderungen oder Systemänderungen gelöst.

Zusammenfassend scheint dieses Problem nicht direkt auf die Boost-Bibliotheken bezogen zu sein, sondern scheint auf der Boost-Installation des Systems zu beruhen. Ein weiterer SO question weist auf ein ähnliches Problem hin, und laut den Kommentaren war es auch erfolgreich, die gleiche Version von Boost (1,60 in ihrem Fall) sauber neu zu installieren.

Hoffe, das kann jemand helfen!

-1

Ich habe dieses Problem auch, schließlich finde ich Ursache für mein Problem, vielleicht wäre es für Sie hilft,

wenn die Core-Datei GDB zeigt es, wie dieses

#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 

ich es gefunden Verwenden Sie die System-Include-Datei, wenn ich die EXE-Datei kompiliere, aber die boost.a-Datei, die nicht die gleiche Version wie die System-Boost ist, verlinkt. es ist überrascht. Wenn ich den System-Boost entferne, ist alles in Ordnung!