2017-04-05 3 views
0

Ich habe zwei Pakete erstellt, P1.dproj und P2.dproj.Warum platziert der Compiler DCUs, die nicht zum aktuellen Paket gehören, in seinem Einheitsausgabeverzeichnis?

Ich habe zwei leere Einheiten in die Verpackungen, so dass P1 enthält Unit1.pas und P2Unit2.pas enthält.

Ich habe das Unit-Ausgabeverzeichnis auf .\P1\$(Platform)\$(Config) und .\P2\$(Platform)\$(Config) in den jeweiligen Paketen bearbeitet.

Ich habe P1 als Referenz zum P2-Projekt hinzugefügt, so dass P2 von P1 abhängt.

Die Projektdateien werden im selben Ordner gespeichert.

Die Verzeichnisstruktur sieht wie folgt aus:

Root\ 
    Source\ 
     P1\ 
     Unit1.pas 
     P2\ 
     Unit2.pas 
    Packages\ 
     P1.dpk 
     P1.dproj 
     P2.dpk 
     P2.dproj 
     P1\ 
     Win32\ 
      Debug\ 
     P2\ 
     Win32\ 
      Debug\ 

Bevor ich die Abhängigkeit P1 hinzugefügt, um eine Packages\P1\Win32\Debug\Unit1.dcu wurde ausgibt und P2 eine Packages\P21\Win32\Debug\Unit2.dcu wurde ausgibt.

Nichts unerwartetes.

Nachdem ich die Abhängigkeit hinzugefügt habe, wenn ich nur P2 gebaut habe, kompiliert die IDE automatisch auch P1, aber die Unit1.dcu Datei wird jetzt in die Packages\P2\Win32\Debug\Unit1.dcu ausgegeben.

Warum ist das?

Die Unit1.dcu Datei ist nicht in der Liste der ContainsP2.droj noch ist es in jedem Bibliothekspfad oder Suchpfad aufgelistet (weder Delphi global noch Projekt lokal).

Warum legt der Compiler Sachen in das Unit-Ausgabeverzeichnis des aktuellen Projekts, auf das er nicht einmal Zugriff auf das Quellverzeichnis hat?

Wenn ich die P1 dpk/dproj Dateien in einen Unterordner verschiebe und die IDE neu starte, wird es sich korrekt beschweren, dass es die Datei P1.dcp nicht finden kann und nicht mit der Kompilierung von P1 beginnt.

ich dieses Verhalten in einem größeren, komplizierteren Aufbau bemerkt hatte, und es wurde mich verrückt ...

+0

Ich kann das nicht mit Berlin kopieren; hat der Gruppe ein neues Projekt hinzugefügt, eine Abhängigkeit hinzugefügt. Kompiliert, beide kompiliert und für beide Projekte waren die DCUs am richtigen Ort. – FredS

+0

Insbesondere müssen die Projekte "Pakete" sein und Sie müssen eine Referenz von einem Paket zum anderen erstellen (nicht nur eine Build-Abhängigkeit in der Projektgruppe). –

+0

@ JensMühlenhoff - Sie können dies mit der Einstellung "Build Control" in den Projektoptionen von P1 steuern. Der Standardwert ist "Nach Bedarf neu erstellen". Ändern Sie es in "Explicit Rebuild" und es wird dieses Verhalten verhindern. (aktualisiert gerade die Antwort) –

Antwort

1

Es ist dies zu tun, weil die Quelldateien für beiden Pakete im selben Verzeichnis sind und P1 gesetzt für "Rebuild nach Bedarf" in den Projektoptionen.

Denken Sie an ein einfaches Projekt Proj1, das eine Einheit U1 enthält und verwendet. U1 verwendet U2, das ist nicht in Proj1 enthalten. Der Compiler muss U2.dcu sehen können; wahrscheinlich im aktuellen Bibliothekspfad oder einem anderen allgemeinen "lib" -Verzeichnis. Wenn Proj1 kompiliert wird, geht U1.dcu in das Unit-Ausgabeverzeichnis von Proj1, aber U2.dcu wird einfach von dort, wo es aktuell lebt, "verwendet" und erscheint nicht in Proj1s Einheitsausgabeverzeichnis.

Angenommen, Sie fügen das Verzeichnis, in dem U2.pas existiert, dem Suchpfad von Proj1 hinzu. Nun kann der Compiler U2.pas sehen, also kompiliert er es und legt das resultierende U2.dcu zusammen mit U1.dcu in das Output-Verzeichnis von Proj1.

Es ist das gleiche hier ... P2 "benötigt" P1. Das heißt, beim Kompilieren von P2 muss der Compiler entweder P1.DCP oder alle Quelldateien für P1 (P1.dpk und unit1.pas in diesem Fall).

In Ihrem Fall kann es P1.dpk sehen, weil es im selben Verzeichnis ist, also kompiliert es es und legt die resultierenden dcu's (unit1.dcu in diesem Fall) in das Einheitsausgabeverzeichnis von P2.

Sie können dieses Verhalten verhindern, indem Sie P1 auf "Explicit Rebuild" in seinen Projektoptionen festlegen. Wenn P2 oder ein Paket, das "P1" erfordert, erstellt wird, sagt dies dem Compiler, "obwohl Sie die Quelle von P1 sehen können, bauen Sie sie nicht auf."

+0

Das macht alles Sinn, außer für den letzten Absatz. Warum versucht der Compiler nicht, dann P1 zu bauen, sondern stattdessen U1 zu bauen? Wenn Unit1.pas in irgendeinem include/lib/was auch immer-Umgebungsverzeichnis wäre, könnte ich sehen, dass es "Sinn macht" (eigentlich würde ich bevorzugen, dass der Compiler nicht nur alles ** kompiliert, was nicht Teil des aktuellen Projekts ist, aber das ist nur meine persönliche Meinung), aber das geht einen Schritt zu weit für mich. –

+0

Ich denke, ich muss die Projektdateien in verschiedene Verzeichnisse trennen, dann * seufz *. –

+0

In der größeren Projektgruppe führte dies tatsächlich dazu, dass Einheiten mehrfach kompiliert wurden und schließlich zu der gefürchteten "mit einer anderen Version kompilierten" Fehlermeldung führte. –

Verwandte Themen