[Visual Studio] Erstellen / Neu erstellen / Bereinigen

ActiveO2

Ensign
Registriert
Feb. 2009
Beiträge
161
Guten Morgen,

kann mir jemand sagen, wann man am besten was benutzt?

Hier habe ich nur eine eigene Meinung gefunden:
Neu erstellen = Bereinigen + Erstellen
Erstellen = nur geänderten Code neu erstellen.


Ich würde sagen:
Sobald ich vorhandenen Code ändere muss ich "Neu erstellen"
und
wenn ich Code ergänze dann nur "Erstellen"?
Lösche ich Code so muss ich den Code "Bereinigen"


Kann mich jemand aufklären?

Vielen Dank!


.
 
Zuletzt bearbeitet:
'Bereinigen' führe ich persönlich nur aus, falls ich spontane Linkerfehler erhalte, die von einer inkrementellen Verknüpfung herrühren könnten oder falls ich außerhalb der IDE massive Änderungen an Code in mehreren Dateien vorgenomen habe.

Ansonsten 'Erstellen' - egal, ob nun Dateien hinzugefügt oder gelöscht wurden.
 
"Neu erstellen" benutzt du garnicht?

Weiß noch jemand was?


.
 
Erstellen: Ich denke das kann man ist wie "make", hier schaut der Compiler, was er neu erstellen muss.
Neu erstellen: Denke hier macht er einfach alles neu, nicht nur das, was geändert wurde.

Soweit ich das weiß kann man sich das so vorstellen:
Wenn du ein Programm aus einer einzigen Quellcodedatei hast wird "Erstellen" und "Neu erstellen" auf das selbe hinauslaufen.
Hast du dagegen UNABHÄNGIGE Quellcodes, müssen nur die geänderten neu kompiliert werden. Hier werden also die Quelltexte unabhängig kompiliert und dann gelinkt. Dies geschieht in 2 Prozessen. Im 1. wird der Source-Code kompiliert (ohne eine .exe zu erstellen), sondern es entsteht ein object file ( .o bei GCC).
Im 2. werden dann die object files gemerged mit dem Linker. Der Linker kombiniert dann die object files und erstellt daraus eine einzige ausführbare Datei.

Wenn du also neu erstellst werden auch die nicht geänderten Quellcodes in .o-Dateien (bei GCC) kompiliert und dann wird alles gelinkt. Das könnte z. B. sinnvoll sein, wenn sich eine .h Datei geändert hat und das nicht bemerkt wird.


Ich habe mein "Wissen" aus "An introduction to GCC" (sehr zu empfehlen), hier der Abschnitt, der das beschreibt, was ich oben beschrieben habe: http://www.network-theory.co.uk/docs/gccintro/gccintro_12.html


Hoffe, recht zu haben und dir geholfen zu haben.

Gruß,

badday
 
ActiveO2 schrieb:
"Neu erstellen" benutzt du garnicht?
'Neu Erstellen' ist nichts weiter als 'Bereinigen' und 'Erstellen' nacheinander ausgeführt.

Üblicherweise managed Visual XYZ die Abhängigkeiten durch Quellcode-Analysen und erstellt nur die Kompilate neu, deren Sourcecodes der Abhängigkeiten sich geändert haben.


Kleines Beispiel (siehe Anhang):
1) Die ausführbare Datei 'Program' wird aus main.o und md5.o gelinkt, ist also direkt von diesen Objektdateien abhängig
2) main.o ist von main.c und md5.h (durch ein Include in main.c) abhängig
3) md5.o ist von md5.c und md5.h (durch ein Include in md5.c) abhängig

Die Abhängigkeit ergibt sich gemäß der angehängten Grafik von oben nach unten.

Sind die zugrundeliegenden Objekte NEUER als die abhängigen Objekte, werden die abhängigen Objekte neu erzeugt. Das entsprecht dem Prozess 'Erstellen'.

'Bereinigen' entfernt alle zwischengespeicherten Objektdateien, sodass eine komplette Neukompilierung erzwungen wird.

Ändert sich main.c, muss main.o neu erzeugt werden, keinesfalls aber md5.o
Ändert sich md5.c, muss md5.o neu erzeugt werden, keinesfalls aber main.o
Ändert sich md5.h, müssen main.o UND md5.o neu erzeugt werden.

In jedem Fall muss 'Program' neu gelinkt werden, da mindestens eins der zugrundeliegenden Objekte (main.o, md5.o oder beide) neuer sind als das abhängige Objekt ('Program').
 

Anhänge

  • depen.png
    depen.png
    26 KB · Aufrufe: 448
Zuletzt bearbeitet:
@XunnD: Gehe ich recht in der Annahme, dass "Neu Erstellen" vor allem dann benötigt wird, wenn sich die Header ändern oder wird dies auch erfasst?

Gruß,

badday
 
es hängt immer davon ab was du in deinen programm geändert hast.

Schreibst du zum BSP hilfedatei in VS dann muss du neuerstellen oder am besten bereinigen und erstellen, weil die sonstige änderungen nicht immer übertragen werden und du später im prinzip nur den sourcecode compiliert hast ohne deine hilfe dateien. bei mir war das üblich so. Findet keine änderung im layout statt compiliert er die Hilfe Datei nicht.

Dieser bug tritt nur bei externen dateien auf die garnicht mit dem hauptrogramm zutunhaben. Keine Ahnung wieso MS das noch nicht gefixt hat.
 
Nochmal: 'Neu erstellen'='Bereinigen'+'Erstellen'

Während des Übersetzungs- und Verknüpfungsprozesses legen Compiler und Linker Arbeitsdateien an (Objekt-Dateien, vorkompilierte Header, etc.) 'Bereinigen' löscht nun ebendiese Dateien und kann auch dazu genutzt werden, das Arbeitsverzeichnis zum Einchecken in ein Versionskontrollsystem (z.B. Subversion/CVS) vorzubereiten (in das üblicherweise nur die Quelltexte eingecheckt werden).

Durch das Löschen der Objektdateien (die für den Verknüpfungsvorgang benötigt werden), erzwingt der Entwickler mit 'Bereinigen' bzw. 'Neu erstellen' eine komplette Neukompilierung aller beteiligten Quelltexte.
 
@XunnD: Also werden Änderungen in den Headerdateien bei gleichzeitig unverändertem Quellcode an sich bemerkt?
 
Ich habe nochmal nachgefragt und folgende Antwort, ohne Fachgesimpel, bekommen:
"Ändere ich nur Quellcode-Dateien (zb: .cpp), reicht es das Projekt zu "Erstellen".
Ändere ich aber eine Header-Datei (.h) So muss ich das Projekt erst "Bereinigen" und danach, je nach vorgehensweise natürlich wieder "Erstellen" ( = "Neu erstellen")."

Stimmt mit dem oben geschriebenen soweit ja fast überein, nur dass der Zusatz fehlt, dass die Quelldatei nur neu kompiliert wird, wenn es eine Headerdatei inkludiert hat welche geändert wurde.


Sollte soweit stimmen, oder?

.
 
Zurück
Oben