Am Mon, 2002-05-13 um 17.19 schrieb David Haller:
Hallo,
On Mon, 13 May 2002, Ralf Corsepius wrote:
Am Mon, 2002-05-13 um 03.05 schrieb David Haller:
On Sun, 12 May 2002, Andre Heine wrote: Nein. gcc ist das Frontend zur _G_NU _C_ompiler _C_ollection (ja, frueher stand das fuer Gnu C Compiler). Der C-Compiler ist 'cc'. Nein. cc ist der Name des System-C-Compilers. Auf GNU Systemen ist es deshalb ein Link auf gcc.
Aeh, stimmt ;)
Ich kompiliere hier froehlich C++ Programme mit dem gcc, Was ein Fehler ist.
Noe ;) Du irrst - es ist ein substanzieller Unterschied, da Du Dich dann um die von g++ implizit benötigten Libs selbst kümmern musst (z.B. -lstdc++)
Allerdings wirst Du die Unterschiede unter Linux nur selten spüren.
Mit gcc >= 3.0 funktioniert das nur noch in Ausnahmefällen. Für C++-Programme deshalb "g++" und nicht "gcc" verwenden
Ok, mache ich in der Regel auch :)
allerdings habe ich auch das C++ Backend "${prefix}/lib/gcc-lib/${arch}/${compilerversion}/cc1plus" sowie das C++ Frontend 'g++' (samt hardlink c++ bzw. andersrum) in "${prefix}/bin/" installiert... Auaweia. cc1plus gehört nach gcc-lib/... und sonst nirgendwo hin.
Da isser ja auch. Hmm? Oben schriebst Du doch, dass Du cc1plus in $(prefix)/bin hättest.
Dort hat er nichts zu suchen. cc1plus ist in Implementierungsdetail, ist hochgradig gcc-versions- und konfigurations-äbhängig und hat deshalb in $(prefix)/bin nichts verloren.
g++/c++ sind nur eine Variante des gcc, wenn ich das richtig sehe... Richtig, die Unterschiede sind aber wesentlich, insbesondere was implizit eingebundene Libs anbetrifft, statische Konstruktoren (ctors)/ Destruktoren (dtors), sowie Exceptionhandling anbetrifft.
Hier gibt es gcc-versions- (libgcc*), plattform- und konfigurationsabängige (--with-threads) Unterschiede.
$ g++ -v -o hello hello.cpp 2>&1 | tee g++.log
Ein Beispiel: # cat cchallo.foo #include <iostream> int main() { std::cout << "hello" << std::endl; } Mit gcc-2.95.3 (SuSE) # gcc -x c++ -o cchallo cchallo.foo /tmp/cc3awaqB.o: In function `main': /tmp/cc3awaqB.o(.text+0xa): undefined reference to `endl(ostream &)' /tmp/cc3awaqB.o(.text+0x17): undefined reference to `cout' /tmp/cc3awaqB.o(.text+0x1c): undefined reference to `ostream::operator<<(char const *)' /tmp/cc3awaqB.o(.text+0x27): undefined reference to `ostream::operator<<(ostream &(*)(ostream &))' collect2: ld returned 1 exit status => Trotz -x c++ ist gcc nicht in der Lage zu übersetzen (findet libstdc++ nicht) => gcc -x c++ ist nicht gleichwertig zu g++. Abhilfe: -lstdc++ # g++ -x c++ -o cchallo cchallo.foo Tut! Was war einfacher? gcc -lstdc++ oder g++? # ldd cchallo libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002d000) libm.so.6 => /lib/libm.so.6 (0x4007a000) libc.so.6 => /lib/libc.so.6 (0x4009c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Nun das gleiche mit gcc-3.1: # /opt/gcc31/bin/g++31 -x c++ -o cchallo cchallo.foo # ldd cchallo libstdc++.so.4 => /opt/gcc31/lib/libstdc++.so.4 (0x40016000) libm.so.6 => /lib/libm.so.6 (0x400d8000) libgcc_s.so.1 => /opt/gcc31/lib/libgcc_s.so.1 (0x400fa000) libc.so.6 => /lib/libc.so.6 (0x40102000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Beachte: Die Abhängigkeiten sind andere. Hier sind es nur die Unterschiede zwischen zwei g++-Versionen auf ein und derselben Maschine, doch auf anderen Plattformen können sie gänzlich anders aussehen Nun das ganze noch einmal mit gcc vs. g++: # /opt/gcc31/bin/gcc31 -v -x c++ -o cchallo cchallo.foo -lstdc++ [..] /opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cchallo /usr/lib/crt1.o /usr/lib/crti.o /opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/crtbegin.o -L/opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1 -L/opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/../../.. /tmp/ccjhF1Sq.o -lstdc++ -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/crtend.o /usr/lib/crtn.o # /opt/gcc31/bin/g++31 -v -x c++ -o cchallo cchallo.foo [..] /opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cchallo /usr/lib/crt1.o /usr/lib/crti.o /opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/crtbegin.o -L/opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1 -L/opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/../../.. /tmp/cc3sOFFX.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /opt/gcc31/lib/gcc-lib/i486-suse-linux/3.1/crtend.o /usr/lib/crtn.o Der wesentliche Unterschied: libgcc_eh (eh .. exception handling) vs. libgcc_s. Würde das Programm Exceptions verwenden, wäre gcc ... nun gescheitert. Lange Rede, kurzer Sinn: Zum Übersetzen von c++-Code "g++/c++" verwenden und die c++-Welt mit gcc wird deutlich einfacher. Ralf