Boost zum Laufen bringen??



  • Hallo,

    ich wollte für ein kleines Programm mal die Boost-threads ausprobieren. Im Paketmanager schnell mal nachgesehn und angeblich ist Boost installiert (wenn auch in alter Version - nutze Fedora 11).
    Hab ein kleines Testprogramm geschrieben und beim compilieren gibt's dann ziemlich viele Fehler, weil nichts bekannt ist! 😞

    Ok, dann hab ich mir die aktuellste Version (1.43) geholt und per
    "tar --bzip2 -xf /path/to/boost_1_43_0.tar.bz2" (wie's dabei stand) installiert.

    Es geht allerdings leider immer noch nichts 😕

    yum install boost-devel brachte auch keine Verbesserung

    Was muss ich tun um's zum laufen zu bringen? Bzw. gibt's einen Aufruf wie ich testen kann in welcher Version Boost vorliegt?

    Aufruf zum compilieren: "g++ threads.cpp -lboost_thread"

    #include <boost/thread.hpp>
        #include <iostream>
    
        using std::cout;
        using std::endl;
    
        int main(){
    
           thread t1;
    
           cout << t1.get_id() << endl;
    
           return 0;
        }
    

    Wäre sehr dankbar für Hilfe 😉



  • Boost.Threads ist einer der Boost-Libs, die kompiliert werden müssen. Das müsstest du also noch erledigen.
    Aber wahrscheinlich ist auch eine vorkompilierte Version über den Paketmanager verfügbar. Ist jedenfalls bei Ubuntu der Fall.



  • Thx...

    Ok, wo liegt die Thread-Lib und wie mach ich das am Besten? (kenn mich nicht wirklich aus mit Linux 😕 )





  • Danke für den Link, aber ich komm damit immer noch nicht hin...

    Habe jetzt rausgefunden, dass boost bei mir in usr/includes/boost ist (nicht in usr/local wie's da stand)
    "Normale" boost-Files kann ich jetzt kompilieren und ausführen. Allerdings gehen immer noch keine mit diesen speziellen Headern 😞

    Nun zu den zu kompilierenden Zusatzfiles... (ich mein Thread usw.)

    Die erste Möglichkeit auf der Website existiert bei mir schon mal nicht

    $ cd path/to/boost_1_43_0
    $ ./bootstrap.sh --help

    => es gibt da kein bootstrap.sh

    Möglichkeit 2:
    tar-File runtergeladen, entpackt, build.sh ausgeführt

    $ cd ~/boost_1_43_0
    $ bjam --build-dir=/tmp/build-boost toolset=gcc stage

    Crash! "Unable to load Boost.Build: could not find "boost-build.jam""
    So und jetzt? Laut google muss man nur

    boost-build /tools/build/v2

    ausführen: Nächstes Prob "/tools" gibt es nicht! (alles natürlich im boost-Ordner)

    Also man muss schon sagen, so toll boost auch ist. Die Installation ist eine Katastrophe!

    Kann mir jemand weiterhelfen, plz? 😕



  • Ich habe gerade selbst versucht, die neueste Boost.Thread-Version zu kompilieren und hatte keine Probleme.
    bootstrap.sh gibt's sehr wohl, da musst du noch mal genauer schauen.

    ./bootstrap.sh --prefix=/path/to/where/du's/haben/willst --with-libraries=thread
    ./bjam install
    

    Und eine Minute später hast du alle boost-Header und die kompilierte Thread-Lib in dem angegbenen Verzeichnis.



  • ok, so jetzt nochmal Schritt für Schritt:

    hab ich nochmal ganz von vorne angefangen...

    - boost_1_43_0 runtergeladen
    - entpackt (in ~/boost/) - diesmal war auch das shellscript dabei...
    - durchgelaufen ohne (erkennbare) Fehlermeldungen

    Jetzt hab ich auf dem Desktop die Datei threads.cpp (da hab ich jetzt mal das Testprogramm von der boost-Website http://www.boost.org/doc/libs/1_43_0/more/getting_started/unix-variants.html (Punkt 6) rein - damit auch nix schief gehen kann)

    Aufruf in der bash:

    ~/$ cd Desktop
    ~/Desktop/$ g++ -I ~/boost/boost_1_43_0/ threads.cpp ???
    

    Was kommt jetzt genau bei "???" hin. Ich muss ja noch (in dem Fall) regex angeben. Ich hab jetzt schon so viel ausprobiert und nichts geht.

    (Installation von boost ist in ~/boost/boost_1_43_0/
    und mittels find hab ich noch /usr/includes/boost gefunden - was da auch immer der Unterschied sein mag)

    Bitte verweist mich nicht wieder auf die boost-Website. Ich studiere die schon seit 3 Tagen und werd nicht schlau draus! 😞

    Vielen Dank 😉



  • Wie das geht steht aber auch unter Punkt 6.
    Ich habe boost testweise in ~/boost installiert, bei mir sieht das demnach so aus:

    g++ -I ~/boost/include regex_example.cpp -o regex_example ~/boost/lib/libboost_regex.a
    


  • </Exit> schrieb:

    ...

    Aufruf in der bash:

    ~/$ cd Desktop
    ~/Desktop/$ g++ -I ~/boost/boost_1_43_0/ threads.cpp ???
    

    Was kommt jetzt genau bei "???" hin. Ich muss ja noch (in dem Fall) regex angeben. Ich hab jetzt schon so viel ausprobiert und nichts geht.

    ...

    Bitte verweist mich nicht wieder auf die boost-Website. Ich studiere die schon seit 3 Tagen und werd nicht schlau draus! 😞

    Vielen Dank 😉

    Du solltest dich vielleicht mal mit der g++-Dokumentation befassen. Es fehlt ein -L<Pfad zu den Bibliotheken> und ein -lboost_thread, wobei

    <Pfad zu den Bibliotheken> eben der Pfad ist, in dem sich die libboost_thread.so oder libboost_thread.a befindet.

    Lars



  • Das komische ist erstmal, dass sich bei mir nicht alle .a Dateien in einem Ordner befinden. Ich hab libboost_regex.a mal gesucht und der Pfad sieht so aus:

    .../bin.v2/libs/regex/build/gcc-4.4.1/release/link-static/threading-multi/libboost_regex.a

    Boom! Es funktioniert damit zwar, aber threads funktionieren immer noch nicht 😕

    Ich hab den Aufruf mit
    /bin.v2/libs/thread/build/gcc-4.4.1/release/link-static/threading-multi/libboost_thread.a
    gemacht und bekomme undefined reference to pthread_...

    Und das mit dem -L... geht ja schlecht, wenn ich keinen Ordner mit allen libs habe oder sucht der auch rekursiv?



  • </Exit> schrieb:

    Ich hab den Aufruf mit
    /bin.v2/libs/thread/build/gcc-4.4.1/release/link-static/threading-multi/libboost_thread.a
    gemacht und bekomme undefined reference to pthread_...

    Da dürfte dann noch -pthread fehlen.

    </Exit> schrieb:

    Und das mit dem -L... geht ja schlecht, wenn ich keinen Ordner mit allen libs habe oder sucht der auch rekursiv?

    Genau wie -I kann natürlich auch -L mehrfach angegeben werden. Rekursive Suche gibt es nicht.

    Wie schon gesagt, du solltest dich mit der g++-Dokumentation befassen.

    Lars



  • aaah, DANKESCHÖN an euch!!! 😉 Jetzt läuft's.

    Warum muss ich eigentlich pthread einbinden, wenn ich nur boost:thread verwende?
    Ok, das ist die Basis auf die aufgebaut wird, aber darum müsste sich doch eigentlich die Library kümmern und nicht der Anwender der Lib oder nicht?



  • </Exit> schrieb:

    Das komische ist erstmal, dass sich bei mir nicht alle .a Dateien in einem Ordner befinden. Ich hab libboost_regex.a mal gesucht und der Pfad sieht so aus:

    .../bin.v2/libs/regex/build/gcc-4.4.1/release/link-static/threading-multi/libboost_regex.a

    Dann ist die Installation mittels bjam nicht komplett durch gelaufen. Bzw. man muß bjam am besten noch den Parameter install mit geben. Denn dann wird zum Schluß jede der Libs in einen Ordner rüber kopiert.

    Also, normalerweise ist das alles in 5 Min. erledigt, vom runter laden von Boost, bjam und BBv2, setzen der zwei Umgebungsvariablen und absetzen des bjam-Kommandos.

    Weiß nicht was ihr da immer am rum fummeln seid. 😕



  • </Exit> schrieb:

    aaah, DANKESCHÖN an euch!!! 😉 Jetzt läuft's.

    Warum muss ich eigentlich pthread einbinden, wenn ich nur boost:thread verwende?

    Du bindest nicht nur die libpthread ein. Der Compiler wird insgesamt in den Threadmodus geschaltet. Jedes cpp, des in einem Programm mit Threads läuft, sollte mit der Option -pthread übersetzt werden, auch wenn innerhalb des Moduls keine Threadfunktionen benutzt werden.

    </Exit> schrieb:

    Ok, das ist die Basis auf die aufgebaut wird, aber darum müsste sich doch eigentlich die Library kümmern und nicht der Anwender der Lib oder nicht?

    Nein, auf einem Unixartigen Betriebssystem ist das so, war schon immer so und wird auch noch lange so bleiben 😉

    Wie schon mehrfach gesagt, du solltest dich mit der Dokumentation des g++ beschäftigen.

    Lars



  • Danke, hab jetzt nochmal bjam mit --install ausgeführt und jetzt ist der Ordner auch da... (.../stage/lib)

    Ich könnte allerdings nochmal schnell Hilfe gebrauchen (ich hab die Doku vom gcc/g++ jetzt auch mal angesehn ;))

    So sieht mein Aufruf aus:

    g++ -I ~/boost/boost_1_43_0 threads.cpp -o threads -pthread -L~/boost/boost_1_43_0/stage/lib/ -lboost_thread
    

    Wenn ich den letzten Teil durch ~/boost/boost_1_43_0/stage/lib/libboost_thread.a ersetze, funktioniert es wunderbar.
    So wie es dasteht, bekomm ich nur "cannot find -lboost_thread"

    Also: ich sag ihm wo er nach zusätzlichen Header suchen soll (-I), Ausgabe (-o), zusätzlich pthread und mache ihm den Pfad zur Lib bekannt (-L).
    Jetzt sollte der Aufruf der Lib mit -l"name ohne lib davor und .a/.so danach" gehen... (da ich dynamisch linke ist die Reihenfolge auch egal)

    Warum geht's nicht?



  • Das ~ wird hinter dem -L vermutlich von der Shell nicht ersetzt. Probier es mal mit dem vollständigen Pfad oder $HOME.

    Lars



  • Super danke. Genau das war's... Mit dem ganzen Pfad geht's. Komisch nur, dass bei -I das Ganze kein Problem ist.



  • </Exit> schrieb:

    Super danke. Genau das war's... Mit dem ganzen Pfad geht's. Komisch nur, dass bei -I das Ganze kein Problem ist.

    Beim -I hast du ein ' ' zwischen dem Schalter und dem Pfad, bei -L nicht. Daher wird das '~' beim -L nicht ersetzt. Wenn du dort ein ' ' einfügst, und der Compiler das immer noch akzeptiert, geht's auch da.

    Lars


Anmelden zum Antworten