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 gefundenChrono 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 bekommeEr 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 Befehlesudo 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 Befehlesudo 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.