reguläre ausdrücke / gcc 3.3.4 Einbindungs - und Anwendungsprobleme



  • Hallo,

    ich habe folgendes Problem und komme gerade keinen Schritt weiter.
    Dazu muß ich vielleicht sagen, dass ich absoluter Anfänger bin.
    Ich möchte reguläre Ausdrücke unter c++ verwenden und benutze als
    Entwicklungsumgebung Anjuta unter Suse Linux 9.2, das den Compiler
    gcc Version 3.3.4 verwendet. Zunächst habe ich versucht, die Boost-
    Bibliotheken 1_32_0 zu installieren. Die Installation klappte auch
    meiner Meinung nach, aber irgendwas habe ich wohl vergssen einzurichten.
    Ich habe in der Entwicklungsumgebung wie gefordert den Include-Pfad auf
    den Installationspfad von Boost gesetzt. Wenn ich jedoch versuche, die
    Bibliothek anzugeben (dieses *.a Archiv), bekomme ich eine Fehlermeldung,
    dass er es nicht findet. Lasse ich dies weg, dann wird das Programm zwar
    erfolgreich compiliert, aber beim Generieren bekomme ich folgende Fehllermeldung:

    g++ -I/home/c++/regular_expressions/boost_1_32_0/boost_1_32_0 -I/home/Kerstin/c++/regexpp3 "felsenstein_pruning_prog_boost.cc" -o "felsenstein_pruning_prog_boost"
    /tmp/cc1dyGng.o(.gnu.linkonce.t._ZN5boost11basic_regexIcNS_12regex_traitsIcEESaIcEEC1EPKcjRKS3_+0x13): In function boost::basic\_regex<char, boost::regex\_traits<char>, std::allocator<char> >::basic_regex[in-charge](char const*, unsigned, std::allocator<char> const&)': : undefined reference toboost::reg_expression<char, boost::regex_traits<char>, std::allocator<char> >::reg_expression[not-in-charge](char const*, unsigned, std::allocator<char> const&)'
    /tmp/cc1dyGng.o(.gnu.linkonce.t._ZN5boost11basic_regexIcNS_12regex_traitsIcEESaIcEED1Ev+0xd): In function boost::basic\_regex<char, boost::regex\_traits<char>, std::allocator<char> >::~basic_regex [in-charge]()': : undefined reference toboost::reg_expression<char, boost::regex_traits<char>, std::allocator<char> >::~reg_expression [not-in-charge]()'
    collect2: ld returned 1 exit status

    Hat jemand eine Idee, woran dies liegt und was man machen kann?

    Als nächstes habe ich dann versucht, die Bibliotheken regex-0.12 einzubinden.
    Diese sind mir allerdings erst recht suspekt. Man muß dabei wohl Pattern
    compilieren mit dem Befehl char *re_compile_pattern(const char* Regex, const
    int regex_size, struct re_pattern_buffer *pattern_buffer); Regex ist dabei das
    zu compilierende Pattern (warum char? weil es alter c-code ist? Aber ein Muster
    ist doch länger als nur ein zeichen, wie binde ich hier einen String ein?
    Ich habe alle diese Felder sowie ihre Adressen angelegt und dann beim Compilieren
    und Generieren auch keine Fehlermeldung bekommen. Beim Ausführen bekomme ich jedoch die
    Meldung: Signal 11 (Segmentation fault)
    Damit kan ich leider auch nichts anfangen. 😢

    Sorry für die vielen Fragen. Ich kenne jedoch niemanden, der sich damit auskennt
    und versuche jetzt seit über einer Woche reguläre Ausdrücke zu benutzen und sehe
    momentan einfach kein Land mehr.
    Ich würde mich riesig freuen, wenn mir jemand helfen könnte.

    Danke schon mal,
    Tina



  • tina_anfänger schrieb:

    Hallo,

    ich habe folgendes Problem und komme gerade keinen Schritt weiter.
    Dazu muß ich vielleicht sagen, dass ich absoluter Anfänger bin.
    Ich möchte reguläre Ausdrücke unter c++ verwenden und benutze als
    Entwicklungsumgebung Anjuta unter Suse Linux 9.2, das den Compiler
    gcc Version 3.3.4 verwendet. Zunächst habe ich versucht, die Boost-
    Bibliotheken 1_32_0 zu installieren. Die Installation klappte auch
    meiner Meinung nach, aber irgendwas habe ich wohl vergssen einzurichten.
    Ich habe in der Entwicklungsumgebung wie gefordert den Include-Pfad auf
    den Installationspfad von Boost gesetzt. Wenn ich jedoch versuche, die
    Bibliothek anzugeben (dieses *.a Archiv), bekomme ich eine Fehlermeldung,
    dass er es nicht findet. Lasse ich dies weg, dann wird das Programm zwar
    erfolgreich compiliert, aber beim Generieren bekomme ich folgende Fehllermeldung:

    g++ -I/home/c++/regular_expressions/boost_1_32_0/boost_1_32_0 -I/home/Kerstin/c++/regexpp3 "felsenstein_pruning_prog_boost.cc" -o "felsenstein_pruning_prog_boost"
    /tmp/cc1dyGng.o(.gnu.linkonce.t._ZN5boost11basic_regexIcNS_12regex_traitsIcEESaIcEEC1EPKcjRKS3_+0x13): In function boost::basic\_regex<char, boost::regex\_traits<char>, std::allocator<char> >::basic_regex[in-charge](char const*, unsigned, std::allocator<char> const&)': : undefined reference toboost::reg_expression<char, boost::regex_traits<char>, std::allocator<char> >::reg_expression[not-in-charge](char const*, unsigned, std::allocator<char> const&)'
    /tmp/cc1dyGng.o(.gnu.linkonce.t._ZN5boost11basic_regexIcNS_12regex_traitsIcEESaIcEED1Ev+0xd): In function boost::basic\_regex<char, boost::regex\_traits<char>, std::allocator<char> >::~basic_regex [in-charge]()': : undefined reference toboost::reg_expression<char, boost::regex_traits<char>, std::allocator<char> >::~reg_expression [not-in-charge]()'
    collect2: ld returned 1 exit status

    Hat jemand eine Idee, woran dies liegt und was man machen kann?

    Setz den Linkerpfad auch auf das Verzeichniss, wo die Libs hinkopiert wurden und binde dann die Libraries ein.

    Als nächstes habe ich dann versucht, die Bibliotheken regex-0.12 einzubinden.
    Diese sind mir allerdings erst recht suspekt. Man muß dabei wohl Pattern
    compilieren mit dem Befehl char *re_compile_pattern(const char* Regex, const
    int regex_size, struct re_pattern_buffer *pattern_buffer); Regex ist dabei das
    zu compilierende Pattern (warum char? weil es alter c-code ist? Aber ein Muster
    ist doch länger als nur ein zeichen, wie binde ich hier einen String ein?
    Ich habe alle diese Felder sowie ihre Adressen angelegt und dann beim Compilieren
    und Generieren auch keine Fehlermeldung bekommen. Beim Ausführen bekomme ich jedoch die
    Meldung: Signal 11 (Segmentation fault)
    Damit kan ich leider auch nichts anfangen. 😢

    char* ist ein Pointer auf einen char. D.h. auf das erste Zeichen einer Zeichenkette, die mit Null terminiert wird. Wenn du C++ Strings verwendset, dann kommst du an den C-String (char*) auf folgende weise drann.

    char *pszC_String;
      std::string s;
      pszC_String = s.c_str();
    

    Also gibst du im Funktionsaufruf einfach

    s.c_str();
    

    an.



  • Hallo,

    erst mal vielen Dank für Deine Antwort. Ich hoffe, es hilft mir weiter. Ich habe auch schon versucht, die Bibliotheken einzubinden. Das heißt, ich habe den Include-Pfad bei Anjuta auf den Boost-Installationspfad gesetzt und bei Bibliothek die Datei libboost_regex-gcc-1_32.a versucht einzubinden. Dies setzt wohl den Parameter -I?
    Auf alle Fälle findet der Compiler die Bibliotheken dann trotzdem nicht. Ich habe diesen Pfad in der in der Doku verwendeten Form: <boost>/libs/regex/build/gcc/libboost_regex-gcc-1_32.a
    eingetragen.
    Dann erhalte ich jedoch folgende Fehlermeldung:
    /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/ld: cannot find -l<boost>/libs/regex/build/gcc/libboost_regex-gcc-1_32.a
    Ich habe den Include als auch den Bibliothekspfad auf alle erdenklichen Arten verändert, aber die Bibliothek bleibt nicht auffindbar... 😢 Was mache ich falsch?

    Vielen Dank noch mal,
    Tina



  • tina_anfäng schrieb:

    Hallo, Auf alle Fälle findet der Compiler die Bibliotheken dann trotzdem nicht. Ich habe diesen Pfad in der in der Doku verwendeten Form: <boost>/libs/regex/build/gcc/libboost_regex-gcc-1_32.a
    eingetragen.
    Dann erhalte ich jedoch folgende Fehlermeldung:
    /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/ld: cannot find -l<boost>/libs/regex/build/gcc/libboost_regex-gcc-1_32.a
    Ich habe den Include als auch den Bibliothekspfad auf alle erdenklichen Arten verändert, aber die Bibliothek bleibt nicht auffindbar... 😢 Was mache ich falsch?

    Du müsstest so was wie

    -L <boost>/libs/regex/build/gcc/ -l boost_regex-gcc-1_32
    

    dem Compiler übergeben. Wichtig: der Unterschied zwischen -l und -L!



  • Sehe ich das richtig, dass -I aber schon gesetzt ist durch die Angabe der Bibliothek? Denn in der Fehlermeldung hat der ja den Pfad des Archiv-Files hinter dem Parameter -I stehen, also kennt er ihn dort schon?
    Für was genau steht das -L und -I?
    -l ist die Bibliothek und -L der Pfad dorthin?
    Und muß ich <boost> durch den Installationspfad von Boost ersetzen? das habe ich bei Anjuta nämlich auch schon versucht, hat aber nix gebracht...
    Wenn ich diese Pfade dem Compiler übergebe, muß ich das ja jedes mal machen. Kann man diese Pfade nicht auch irgendwo fest setzen?



  • Schau mal, wo Boost bei dir liegt. ICh habe gerade geschaut. Bei mir liegt boost unter /usr/lib. Sollte das der fall sein, musst du nur

    -l boost_regex-gcc-1_32
    

    zum Linker hinzufügen. Wie das genau bei Anjuta geht, kann ich dir leider nicht sagen, da ich es nicht benutze. Das -I musst du nicht setzen, da die Boost Includes schon im standard Pfad des Compilers liegen. Das -L kannst du auch weglassen, wenn die Libs im standard Pfad für Libraries /usr/lib oder /lib liegen.



  • Das hört sich fast so an, als wäre es sinnvoll, die Dateien in usr/lib zu installieren. 😉
    Ist es eigentlich ohne Probleme möglich, boost zu verschieben? Muß man dazu erst alles wieder deinstallieren, damit es keine Probleme gibt? Oder lasse ich es besser dort wo es ist?
    Tut mir leid, dass ich Dir gerade Löcher in den Bauch frage, aber Du hilfst mir unheimlich weiter.



  • Wo ist Boost denn jetzt installiert? Wie hast du es denn installiert?



  • Hi,

    ich habe die Parameter wie folgt gesetzt:
    Include-Pfad: I/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0
    dies entspricht dem Boost-Installationspfad

    Bibliothekspfad
    I/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0/libs/regex/build/gcc/

    Bibliothek -l/libboost_regex-gcc-1_32.a

    (siehe auch Fehlermeldung unten)

    Dies sind die Pfade, in die ich die Dateien installiert habe. Trotzdem wird die Bibliothek nicht gefunden.

    Ich muß irgendeienn blöden Fehler dabei machen, habe aber keine Ahnung, wo ich noch anstezen könnte.

    Datei testprog_boost.cc wird generiert ...
    g++ -I/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0 "testprog_boost.cc" -L/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0/libs/regex/build/gcc/ -l/libboost_regex-gcc-1_32.a -o "testprog_boost"
    /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/ld: cannot find -l/libboost_regex-gcc-1_32.a
    collect2: ld returned 1 exit status
    Completed ... unsuccessful
    Total time taken: 4 secs



  • tina_anfaeng schrieb:

    Bibliothek -l/libboost_regex-gcc-1_32.a

    Der Schrägstrich ist zu viel. Muss heißen:

    -lboost_regex-gcc-1_32
    

    oder

    -l boost_regex-gcc-1_32
    

    Sonst sucht der gcc im Wurzelverzeichniss nach libboost_regex-gcc-1_32.a, also bei /libboost_regex-gcc-1_32.a...

    Edit: Das lib vor und das .a hinter und vor den Library-Namen entfehrnt (siehe unten)



  • Es ist zum aus der Haut fahren, aber es funktioniert trotzdem nicht. Ich habe den Paramet wie folgt gesetzt -llibboost_regex-gcc-1_32.a und erhalte trotzdem noch dieselbe Fehlermeldung... ;-(((

    Wie kann man gcc denn die Parameter direkt uebergeben? Vielleicht liegt es ja an Anjuta. Aber unter gcc --help finde ich nicht, wie ich die Include- und Bibliothekspfade als Parameter uebergeben kann.

    Danke Dir.

    Datei testprog_boost.cc wird generiert ...
    g++ -I/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0 "testprog_boost.cc" -L/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0/libs/regex/build/gcc/ -llibboost_regex-gcc-1_32.a -o "testprog_boost"
    /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/ld: cannot find -llibboost_regex-gcc-1_32.a
    collect2: ld returned 1 exit status
    Completed ... unsuccessful
    Total time taken: 4 secs



  • ProgChild schrieb:

    tina_anfaeng schrieb:

    Bibliothek -l/libboost_regex-gcc-1_32.a

    Der Schrägstrich ist zu viel. Muss heißen:

    -llibboost_regex-gcc-1_32.a
    

    oder

    -l libboost_regex-gcc-1_32.a
    

    Sonst sucht der gcc im Wurzelverzeichniss nach libboost_regex-gcc-1_32.a, also bei /libboost_regex-gcc-1_32.a...

    Das ist nicht alles... Wenn ich mich nicht irre, dann kannst du das lib und das .a auch weglassen. Ich bin mir aber nicht sicher, ob du das musst. Also:

    -lboost_regex-gcc-1_32
    


  • Du müsstest mit

    g++  -I/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0 -c testprog_boost.cc
    g++ -L/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0/libs/regex/build/gcc/ -lboost_regex-gcc-1_32 testprog_boost.o -o terstprog
    

    das Programm übersetzen müssen. Vorrausgesetzt, dass unter "/home/Kerstin/c++/regular_expressions/boost_1_32_0/boost_1_32_0/libs/regex/build/gcc/" die Datei libboost_regex-gcc-1_32.a oder/und libboost_regex-gcc-1_32.so liegt.



  • Yuchuuuh, es funktioniert!!! :-))))

    Wenn man das lib und .a weglässt! Darauf wäre ich nie gekommen!
    Tausend Dank für Deine Hilfe!


Anmelden zum Antworten