gcc-Kompilierfehler bei Hallo World - c++ Projekt!



  • Hallo!

    Mein Code:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      cout << "Hallo World" << endl;
      return 0;
    }
    

    Aufruf:
    root@Knoppix:/media/sda4/root/hallo_world# gcc -save-temps -Wall -std=c++98 -x c++ -o hallo_world hallo_world.cpp

    Fehlermeldung:

    hallo_world.o: In function `std::__verify_grouping(char const*, unsigned int,
    std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    hallo_world.cpp:(.text+0xe): undefined reference to `std::basic_string<char, s
    td::char_traits<char>, std::allocator<char> >::size() const'
    hallo_world.cpp:(.text+0x59): undefined reference to `std::basic_string<char,
    std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'
    hallo_world.cpp:(.text+0x97): undefined reference to `std::basic_string<char,
    std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'
    hallo_world.cpp:(.text+0xdf): undefined reference to `std::basic_string<char,
    std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'
    hallo_world.o: In function `__static_initialization_and_destruction_0(int, int
    )':
    hallo_world.cpp:(.text+0x129): undefined reference to `std::ios_base::Init::In
    it()'
    hallo_world.o: In function `__tcf_0':
    hallo_world.cpp:(.text+0x176): undefined reference to `std::ios_base::Init::~I
    nit()'
    hallo_world.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
    collect2: ld returned 1 exit status
    

    Mit g++ umgehe ich den Fehler. Aber mit ldd hallo_world sehe ich:

    linux-gate.so.1 => (0xHexzahl)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xHexzahl)
    libm.so.6 => /lib/libm.so.6 (0xHexzahl)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xHexzahl)
    libc.so.6 => /lib/libc.so.6 (0xHexzahl)
    /lib/ls-linux.so.2 (0xHexzahl)
    

    Und ich habe gelesen das mit gcc keine dynamischen Libs gesetzt/verknüpft werden. Und das man gcc benutzen soll.
    Wozu ich das brauche? Für die Leute die alles wissen wollen (genauso wie Schäuble ), obwohl das schon unter Datenschutz zählt 🙄 :
    Das ist nicht das eigentliche Programm ... das eigentliche Programm hat den selben Fehler und soll auf ein Rechner ausgeführt werden worauf gcc nicht installiert ist. Die auch folgende Dateien nicht hat:

    linux-gate.so.1 => (0xHexzahl)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xHexzahl)
    libm.so.6 => /lib/libm.so.6 (0xHexzahl)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xHexzahl)
    libc.so.6 => /lib/libc.so.6 (0xHexzahl)
    /lib/ls-linux.so.2 (0xHexzahl)
    

    Die Frage ist also wie kompiliere ich alles in die Binärdatei rein und habe somit keine dynamischen Libs mehr (z.B. mit g++ und Parameter^1). Oder, wenn das stimmt mit gcc! Wie kompiliere mit gcc womit sich das mit den dynamischen Libs geklärt hat.

    ^1 Ich habe keine passenden Parameter gefunden.





  • ne bring nichts ..



  • Achso!
    Mit gcc ist der Fehler nicht weggegangen, aber du meintest bestimmt:
    g++ -static blablab...

    Das Ergebnis von ldd hallo_world ergab:
    not a dynamic executable

    Das ist es doch jetzt oder? Jetzt kann ich das auch auch woanders ausführen?



  • gcc/g++ schrieb:

    Das ist es doch jetzt oder? Jetzt kann ich das auch auch woanders ausführen?

    ich habe keinen schimmer. ich bin eigentlich kein linuxer und hab geraten. testen mußt du es selber. aber sag dann bescheid, ob's klappt.



  • Ok ... mach ich. Sag dann gleich Bescheid.
    (Muss erstmal Rechner schleppen.)



  • Hat leider nicht funktioniert:
    FATAL: kernel too old
    Segmentation fault

    Ich habe mit Knoppix 2.6 kompiliert ...
    der andere Rechner hat 2.4

    Bei überprüfen welchen Kernel ich eigentlich habe .. ist mir aufgefallen das das System mit gcc3.3 kompiliert wurde. Per Zufall habe ich es dann mal mit g++-3.3 kompiliert und das hat dann auf den anderen Rechner funktioniert. (Ohne -static denn mit -static kam das selbe Problem wie oben).
    Also es funktioniert erstmal. Aber man weiß nie wann das System geändert/geupdatet wird. Wer also eine andere Lösung hat, dann her damit.
    Desweiteren bin ich einfach Wissens begierig .. wie das mit gcc funktionieren soll oder ob das auch mit -static funktioniert solange ich es mit 2.4 kompiliere.
    Danke.



  • gcc/g++ schrieb:

    Und ich habe gelesen das mit gcc keine dynamischen Libs gesetzt/verknüpft werden. Und das man gcc benutzen soll.

    Nur wenn Du keine Libs brauchst. Dein Programm braucht aber die libstdc++, dh. entweder musst Du sie - wie von volkard vorgeschlagen - statisch dazulinken (etwas unsauber), oder aber Du nimmst den g++ oder Du nimmst gcc und linkst manuell die libstdc++ dazu (umständlich und unsinnig).

    Oder, wenn das stimmt mit gcc! Wie kompiliere mit gcc womit sich das mit den dynamischen Libs geklärt hat.

    Es gibt eigentlich keinen Grund, mit gcc statt g++ zu kompilieren, wenn Du nicht die libstdc++ weglassen möchtest (was Du offensichtlich nicht möchtest).

    Off-Topic: Willkommen zurück, volkard. Ewig nicht gesehen. 🙂



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • g++ linkt die libs also automatisch

    Du nimmst gcc und linkst manuell die libstdc++ dazu (umständlich und unsinnig).

    Deswegen ist das auch unsinnig.

    Nur "g++" ist für mich nicht ausreichend. Also habe ich -static mitgenommen. Fehlermeldung:
    FATAL: kernel too old
    Segmentation fault
    Fehlermeldung ist eventuell (wie oben beschrieben) nachvollziehbar. Also fällt g++ auch weg.

    g++-3.3 hat aber funktioniert, da ich die benötigten Dateien auf den anderen Rechner habe.

    So wie ich das jetzt aber verstanden habe, hätte es dann mit -static und g++-3.3 funktionieren müssen. Hat es aber nicht. Also habe ich -static nicht ganz verstanden. Oder kann sich das jemand erklären?
    -static bindet doch nur die Libs an der Binärdatei und hätte somit genauso funktionieren müssen.


Anmelden zum Antworten