Boost mit dem g++ kompilieren



  • joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ g++ main.cpp -L /usr/local/include/ -o main -lboost_system 
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ ./main 
    ./main: error while loading shared libraries: libboost_system.so.1.55.0: cannot open shared object file: No such file or directory
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$
    

    hmmm.

    root@jo-desktop:/usr/local/include/boost/chrono# find / -name lboost_system
    root@jo-desktop:/usr/local/include/boost/chrono#
    
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ g++ main.cpp -L /usr/local/lib/libboost_system.so.1.55.0 -o main -lboost_system 
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ ls
    main  main.cpp  Makefile  playing10.pro  playing10.pro.user
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ ./main 
    ./main: error while loading shared libraries: libboost_system.so.1.55.0: cannot open shared object file: No such file or directory
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$
    

    @Kellerautomat
    Woher hast du die Informationen, dass man -lboost_system hinzufügen muss? Hab ich das etwa auf der boost.org Seite übersehen?
    EDIT: Habs gefunden

    Chrono depends on the non header-only library Boost.System, so that you will need to link with boost_system.

    auf http://www.boost.org/doc/libs/1_55_0/doc/html/chrono/users_guide.html



  • #define BOOST_CHRONO_HEADER_ONLY
    #define BOOST_ERROR_CODE_HEADER_ONLY

    #include <boost/chrono.hpp>

    int main()
    {
    return 0;
    }

    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ g++ main.cpp -L /usr/local/lib/libboost_system.so.1.55.0 -o main -lboost_system 
    In file included from /usr/local/include/boost/chrono/detail/system.hpp:12:0,
                     from /usr/local/include/boost/chrono/system_clocks.hpp:64,
                     from /usr/local/include/boost/chrono/chrono.hpp:13,
                     from /usr/local/include/boost/chrono/include.hpp:15,
                     from /usr/local/include/boost/chrono.hpp:17,
                     from main.cpp:4:
    /usr/local/include/boost/system/error_code.hpp:516:54: fatal error: boost/../libs/system/src/error_code.cpp: Datei oder Verzeichnis nicht gefunden
    compilation terminated.
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$
    


  • Was iar mir

    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ LD_LIBRARY_PATH=/usr/local/lib ./main
    

    ?

    Damit du nicht jedesmal beim Programm starten den LD_LIBRARY_PATH angeben musst, kannst du entweder /usr/local/lib in /etc/ld.so.conf eintragen, oder du installierst Boost gleich richtig. Unter Debian kannst du dir Boost gleich mit dem Paket libboost-all-dev installieren, dann sollte es auch in den richtigen Pfaden liegen und du musst ld.so.conf nicht händisch anpassen.



  • Jo Danke! Ich habe vorerst /usr/local/lib zu /etc/ld.so.conf hinzugefügt.
    Danach den Befehl ldconfig ausführen. Jetzt kann ich ./main ausführen. In den standard Debian repositories ist Boost doch veraltet.



  • Ok ich weiß nicht wieso ich den folgenden Code nicht ausführen kann:

    #include <boost/chrono.hpp>
    using namespace boost::chrono;
    
    int main(void)
    {
        steady_clock::time_point tp = steady_clock::now();
    
    }
    

    Nach eingabe von make :

    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ make
    g++ -I.  -c main.cpp -L /usr/local/lib/libboost_system.so.1.55.0 -lboost_system
    g++ -I.  -o playing10 main.o -L /usr/local/lib/libboost_system.so.1.55.0 -lboost_system
    main.o: In function `main':
    main.cpp:(.text+0x9): undefined reference to `boost::chrono::steady_clock::now()'
    collect2: error: ld returned 1 exit status
    make: *** [playing10] Fehler 1
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$
    

    Wieso findet er die folgende Funktion nicht?

    boost::chrono::steady_clock::now()
    

    Wie kann ich Boost nun komplett löschen? Die Ausgabe von

    $ ./b2 --help
    

    und

    $ ./bootstrap.sh --help
    

    bringen mich nicht weiter. Da kann ich keine uninstall methode finden. Wie lösche ich also boost komplett von meinem System am besten? Ich würde folgendermaßen vorgehen:

    /usr/local/include/boost
    

    rekursiv löschen
    dann in das Verzeichnis

    /usr/local/lib
    

    wechseln um dort dann mit dem Befehl

    ls -lt --full-time
    

    festzustellen welche Dateien am 11.07 kopiert wurden. Wenn diese was mit "boost" im namen haben werden sie gelöscht. Danach würde ich noch die Zeile mit dem

    /usr/local/lib
    

    aus der Datei

    /etc/ld.so.conf
    

    entfernen um danach den Befehl

    ldconfig
    

    mit root Rechten auszuführen. Nach dem ich es deinstalliert habe möchte ich boost aus den repositories installieren um zu überprüfen ob es dort funktioniert.
    In C++11 funktioniert alles.

    #include <iostream>
    #include <chrono>
    
    int main(void)
    {
    	std::chrono::steady_clock::time_point tp = std::chrono::steady_clock::now();
    	return 0;
    }
    

    kompiliert mit

    g++ main.cpp -o main -std=c++11
    


  • Hört sich gut an. Mehr als die Dateien in die entsprechenden Verzeichnisse zu kopieren dürfte der "Installer" nicht gemacht haben. Glaube auch, dass du mit /usr/local/include/boost und /usr/local/lib/*boost* alle erwischt hast.

    Als ich noch Debian Stable verwendet habe, hatte ich mittels Pinning den GCC und Boost aus Testing installiert. Weil da waren mir neue Versionen wichtig, beim Rest wars mir egal und konnte mir so unnötige Updates ersparen. Hat super funktioniert.



  • ok. Ich habs jetzt so wie ich es in meinem vorpost schon beschrieben deinstalliert, um es dann mit apt-get install libboost-all-dev
    boost zu installieren.
    Das Ergebnis ist nicht gerade erfreulich weil ich immer noch den gleichen Fehler bekomme 😞 Er findet die Funktion now() nicht.

    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ make
    g++ -I.  -c main.cpp -L /usr/lib/ -lboost_system
    g++ -I.  -o playing10 main.o -L /usr/lib/ -lboost_system
    main.o: In function `main':
    main.cpp:(.text+0x1d): undefined reference to `boost::chrono::steady_clock::now()'
    collect2: error: ld returned 1 exit status
    make: *** [playing10] Fehler 1
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$
    

    Wo liegt der Fehler?
    in der Datei

    /usr/include/boost/chrono/detail/inlined/posix
    

    kann ich die Funktion

    steady_clock::time_point steady_clock::now() BOOST_NOEXCEPT
    

    in Zeile 74 finden.
    Ich bin irgendwie auf einem völlig falschen weg und ich weiß erlich nicht mehr weiter! Es muss doch irgendwo ein Fehler sein?

    EDIT: Ok ich hab noch ein paar libs hinzugfefügt die Seite http://stackoverflow.com/questions/13653361/another-undefined-reference-error-when-linking-boost-libraries hat mir da weiter geholfen. Ich weiß nur nicht wie man darauf kommt das man die libs hinzufügen muss.
    Ich hab meine Makefile etwas geändert: Hier die Ausgabe von make:

    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$ make
    g++ -I.  -c main.cpp -L /usr/lib/ -lboost_system -lboost_timer -lboost_chrono -lrt
    g++ -I.  -o playing10 main.o -L /usr/lib/ -lboost_system -lboost_timer -lboost_chrono -lrt
    joshua@jo-desktop:~/Dokumente/misc/cpprimer/playing10$
    


  • Da Du ja mit Linux arbeitest empfehle ich Dir, die Softwareverwaltung zu verwenden, um Boost zu installieren. Boost ist praktisch in allen Linuxdistributionen fertig paketiert und einfach installierbar. Software sollte man unter Linux nicht ohne sehr guten Grund aus an der Paketverwaltung vorbei installieren.



  • tntnet schrieb:

    Da Du ja mit Linux arbeitest empfehle ich Dir, die Softwareverwaltung zu verwenden, um Boost zu installieren. Boost ist praktisch in allen Linuxdistributionen fertig paketiert und einfach installierbar. Software sollte man unter Linux nicht ohne sehr guten Grund aus an der Paketverwaltung vorbei installieren.

    Ja das habe ich ja auch wie in dem Vorpost von mir schon gemacht. Dort tritt aber der gleiche Fehler auf(hab ich ja wie schon beschrieben gelöst mit dem hinzufügen einiger libs. Ich weiß aber nicht wie man selber darauf kommt diese zu den Compileroptionen hinzuzufügen). Als ich gerade den Debian gebootet hatte startete sich kein Gnome 3 mehr. Ich kam nur in die große Textbox in runlevel 6 glaub ich. Dort konnte ich mich dann anmelden. Nach einem startx hatte ich wieder meine Oberfläche wieder allerdings nicht die Originale.
    Kann es sein das mir die Befehle

    sudo apt-get autoremove
    
    sudo apt-get autoclean
    

    viel zu viel gelöscht haben? Das Programm "gedit" war danach weg. Auf den man pages steht:

    man apt-get schrieb:

    autoremove
    autoremove wird benutzt, um Pakete zu entfernen, die automatisch
    installiert wurden, um Abhängigkeiten für andere Pakete zu erfüllen
    und die nicht mehr benötigt werden.

    Was heißt den "die nicht mehr benötigt werden" ? Also ich hätte es gut gefunden ,wenn gedit noch da wäre und anscheinend noch etliche andere Pakete. Hmm es wird Zeit zu Arch Linux zu wechseln.



  • Was ist denn daran so schwer? Der Compiler beschwert sich, dass Funktion X fehlt, die aus Boost Lib Y kommt, also linkst du mit -lboost_Y. Deine Toolchain auf 50 verschiedene Arten zu installieren wird dir da nicht helfen.



  • Kellerautomat schrieb:

    Was ist denn daran so schwer? Der Compiler beschwert sich, dass Funktion X fehlt, die aus Boost Lib Y kommt, also linkst du mit -lboost_Y.

    Und was macht dann -lrt ? Das brauche ich nicht für die Boost-Chrono Kompilierung. Danke allen die mir helfen konnten. Ich setzte jetzt mein System neu auf...



  • Das weiss ich nicht, wird wohl irgendeine plattformspezifische Lib sein. rt klingt nach runtime.



  • Keksman schrieb:

    Kellerautomat schrieb:

    Was ist denn daran so schwer? Der Compiler beschwert sich, dass Funktion X fehlt, die aus Boost Lib Y kommt, also linkst du mit -lboost_Y.

    Und was macht dann -lrt ? Das brauche ich nicht für die Boost-Chrono Kompilierung.

    Du brauchst lrt vielleicht nicht direkt, aber Boost-Chrono schon.

    Keksman schrieb:

    Ich weiß aber nicht wie man selber darauf kommt diese zu den Compileroptionen hinzuzufügen.

    In der Doku nachschauen oder den Fehler googlen. Boost ist in der Beziehung nicht sehr Linux-affin.

    Als ich gerade den Debian gebootet hatte startete sich kein Gnome 3 mehr. Ich kam nur in die große Textbox in runlevel 6 glaub ich. Dort konnte ich mich dann anmelden. Nach einem startx hatte ich wieder meine Oberfläche wieder allerdings nicht die Originale.
    Kann es sein das mir die Befehle

    sudo apt-get autoremove
    
    sudo apt-get autoclean
    

    viel zu viel gelöscht haben? Das Programm "gedit" war danach weg.

    Naja, "einfach so" sollten diese Befehle nichts löschen. Es kann sein, dass du auf Debian testing bist, da muss man dann etwas aufpassen, was der Paketmanager macht und ihm nicht einfach blind vertrauen. Oder es kann sein, dass du sonst irgendwelchen Blödsinn gemacht hast.

    Hmm es wird Zeit zu Arch Linux zu wechseln.

    Du kannst dir auch Arch-Linux zerschiessen, wenn du unvorsichtig bist. Mache einfach nichts, von dem du nicht weisst, was es tut, dann solltest du keine Probleme haben.


Anmelden zum Antworten