[linux-l] Fragen zum Compiler gcc-3.4.x
Axel Weiß
aweiss at informatik.hu-berlin.de
Di Dez 7 19:21:49 CET 2004
Juergen Rienaecker wrote:
> Das kann ich machen, wenn es hilft.
:)
> Nun zu meinen bisherigen Erfahrungen mit dem Gcc-3.4.3.
> Alles was ich mit ihm übersetzen konnte, läuft stabil.
> Ich habe gemessen an komprimierten rpm-Dateien jetzt schon
> fast 200 MB übersetzt.
Hallo Jürgen,
Es wäre richtig interessant zu erfahren, welche Kniffe zum Erfolg
führten...
> Für ein gültige Urteil zur Beschleunigung der Laufzeit des erzeugten
> Codes fehlt mir ein Tool. Aber der selbstkompilierte Mozilla
> ist deulich schneller als das Binärpaket einer Heft-CD.
> Ich habe auf meiner Suse-9.1 zunächst alle Pakete, die ich für
> Laufzeit der wesentlichen Programme für relevant hielt, mit dem
> gcc-3.4.3 neu übersetzt. Also zunächst den Kernel, auch den
> Suse-kernel habe ich geknackt,
Hast Du Dir gemerkt, was Du verändert hast? (Oder kommt man da von
selbst drauf, wenn man nur den Compiler anwirft und sich die
Fehlermeldungen ansieht?)
> dann XFree, die meisten libs aus
> der Reihe glib2, gtk2 in Richtung gnome-2.4, ImageMagick, Gimp,
> Mozilla-1.7.2 (das Update für Suse-9.2) und einige Gnomepakete
> (nautilus, epiphany und einiges mehr).
>
> Der gcc-3.4.3 tolleriert schlampiges Programieren weniger.
... und das ist gut so ;)
> Er mag es nicht wenn in source-xy.h etwas wesentlich anderes
> für eine Funktion steht als in source-xy.c.
> Bei "switch case" tolleriert er kein default: ohne ';'.
> Ein default ohne folgende Anweisung ist ja auch unnötig.
(Nicht ganz) Bei einem fehlenden default kriegst Du eine Warnung, wenn
nicht alle enum-Werte in den case-Zweigen auftauchen, da ist ein leerer
default-Zweig schon hilfreich. Beispiel:
enum EinEnumTyp {E1=0, E2, E3, NUM_E};
// NUM_E hat keine 'enumerierte' Semantik, sondern sagt aus, wie viele
Einträge in der (wachsenden) Definition stecken. Dann lassen sich so
Dinge machen wie:
EinAndererTyp tabelle[NUM_E] = {...};
// oder
for (EinEnumTyp e=0; e<NUM_E; ++e) ...
Und eine switch-Anweisung sieht dann so aus:
switch (e){
case E1: ... break;
case E2: ... break;
case E3: ... break;
default: break;
}
Das letzte break kann man weglassen, das ; nicht. Und ohne default muss
man entweder ein case NUM_E: schreiben (was keine Semantik besitzt)
oder man handelt sich Compilerwarnungen ein.
> Bei c++ nehmen es einge Programierer nicht so genau mit dem
> Verteilen von ';'.
> Ich habe nur das korrigiert, was ich verstanden habe, schließlich
> soll der Code auch stabil laufen.
>
> Das ebx-Problem ist mir bisher 3 mal begegnet.
> Bei libpng-1.2.5, SDL-1.2.7 und gstreamer.
> Solange ich nicht verstanden habe, was da gemacht wird, und
> wie ich es seriös beheben kann, greife ich da nicht ein.
> Für gnome-2.4 der Suse-9.1 habe ich ja die Binärpakete.
> Den gstreamer für gnome-2.6.1 habe ich nun doch mit dem
> gcc-3.3 übersetzt, da es sonst bei meinen Vorhaben, gnome-2.6.1
> aus den Quellpacketen der Linux-user-CD für meine Suse-9.1
> zu übersetzen, nicht weiter geht.
Wäre doch interessant, mal auszuprobieren, ob die Pakete ohne diesen
Hack auch laufen...
> Suse unterstützt die Selbtcompilierer nicht, sonst würde es
> Patchdateien für die Quellpakete geben. Warum muß ich 40 MB
> für ein Update der Kernelsources oder für XFree saugen wenn
> der eigentliche Patch nur wenige KB ist ?
Du unterschätzt das Problem, Quellcode durch eine Menge von Patches
konsistent zu halten. Gerade wenn es viele Patches für ein Paket werden
(Beispiel: kernel), muss darauf geachtet werden, alle Patches in der
richtigen Reihenfolge anzuwenden. Das erfordert Leute mit Weitblick ;)
und eine Infrastruktur mit regelmäßiger Pflege. Bei SuSE habe ich eher
den Eindruck, dass die froh sind, wenn die meisten Pakete so laufen,
wie sie ausgeliefert wurden. Das Saugen großer Patches macht auch mit
DSL keinen Spaß...
Gruß,
Axel
--
Humboldt-Universität zu Berlin
Institut für Informatik
Signalverarbeitung und Mustererkennung
Dipl.-Inf. Axel Weiß
Rudower Chaussee 25
12489 Berlin-Adlershof
+49-30-2093-3050
** www.freesp.de **
Mehr Informationen über die Mailingliste linux-l