VS2008: Kann ich ein Projekt mit 2 CPP-Dateien gleichen Namens in verschiedenen Ordnern erstellen?

8

Hier ist meine Ordnerstruktur:

%Vor%

Beim Erstellen des Projekts erhalte ich einen Linkfehler (LNK2028: nicht aufgelöster Token und so weiter ...), der besagt, dass einige Symbole nicht definiert sind. Ich habe bestätigt, dass alle Symbole definiert sind und dass alle deklarierten Funktionen eine entsprechende Definition haben.

Ich habe das Gefühl, dass beim Kompilieren meines Projekts die utility.cpp -Dateien aus beiden Ordnern in den gleichen utility.obj im Ausgabeordner kompiliert werden. Infolgedessen überschreibt man den anderen.

  1. Ist das erwartetes Verhalten?
  2. Wie kann ich? Erstellen Sie eine C ++ - Binärdatei, die zwei enthält Dateien mit dem gleichen Namen (obwohl in verschiedene Ordner)?
Agnel Kurian 17.02.2010, 14:42
quelle

6 Antworten

12

Klicken Sie mit der rechten Maustaste auf beide / .cpp-Dateien & gt; properties & gt; C/C++ & gt; Output Files & gt; Object File Name & gt; Legen Sie einen benutzerdefinierten Namen fest. z.B. Wenn beide Dateien den Namen MyFile.cpp im Ordner A und einen anderen im Ordner B haben, können Sie die Ausgabe auf AMyFile und BMyFile setzen.

Alternativ können Sie auch ein Makro verwenden, um den Objektnamen den Namen des übergeordneten übergeordneten Ordners voranzulegen (d. h. $(IntDir)$(SafeParentName)$(SafeInputName) ). Wenn das nicht genug ist (zB Sie haben A/B/MyFile.cpp und C/B/MyFile.cpp ) und es Ihnen nichts ausmacht, dass einige Objektdateien Ihren Quellbaum überfluten, können Sie auch $(InputDir)\ verwenden, was die Objektdateien in den gleichen Ordner wie die Quelldatei.

Die cpp-Dateien werden dann in zwei verschiedene Objektdateien kompiliert.

viel Spaß!

Update für VS2010: Es gibt eine bessere Lösung in VS2010, überprüfen Sie es hier . Vielen Dank an n1ck Kommentar

Übrigens, wenn der Inhalt den gleichen Namen hat, trennen Sie sie mit verschiedenen Namespaces?

%Vor%

Ich weiß nicht, ob es wichtig ist, aber für den Menschen ist es definitiv klarer: D

    
Afriza N Arief 17.02.2010, 15:27
quelle
2

Sie könnten versuchen, Ihrer Lösung ein weiteres Projekt hinzuzufügen, das eine statische mudule.lib -Datei aus dem .cpp .h Ihres Moduls erstellt und dann Ihr Hauptprojekt mit dieser lib verknüpft. Es sollte VS veranlassen, .obj-Dateien in einem separaten Verzeichnis auszugeben, und Sie sollten in der Lage sein, ohne Probleme zu verknüpfen.

    
Dmitry 17.02.2010 15:01
quelle
1

Wollen Sie wirklich zwei verschiedene, aber gleichnamige Dateien im selben Projekt?

    
mickeyf 17.02.2010 15:03
quelle
1

Die einfachste Sache, die gut funktioniert, ist, die widersprüchlichen .objs in verschiedene Unterordner zu setzen (ich habe diese Technik mit 2003 und 2008 verwendet), basierend auf den Quellverzeichnissen.

Zum Beispiel:

Setzen Sie für src \ gui \ utils.cpp "Objektdateiname" auf ". \ Debug \ gui /" und Setzen Sie für src \ database \ utils.cpp den Wert ". \ Debug \ database /".

Während ich es manuell mache, wenn ich einen Konflikt sehe, kann ich mir vorstellen, dass das Schreiben eines Skripts, das das Projekt für jede .cpp-Datei (oder nur für widersprüchliche) aktualisiert, eine ziemlich triviale Aufgabe wäre.

    
Martin Bilski 27.12.2010 22:28
quelle
0

Vielleicht würden Bibliotheken (statisch oder dynamisch) bei Ihrem Fall helfen. Aber Sie werden immer noch ein Problem haben, wenn es öffentliche Symbole mit dem gleichen Namen wie in einer ausführbaren oder anderen Bibliothek gibt.

    
Dominic.wig 17.02.2010 15:02
quelle
0

Ich kenne die VS-Kompilierungskette nicht.

Jedes CPP wird jedoch zuerst in eine OBJ-Datei kompiliert. Die Verknüpfungsschritte führen sie zusammen.

Es ist sehr üblich, alle .obj-Dateien in einem Verzeichnis zu speichern. Also, wie du vermutet hast, löscht das erste, wenn du das zweite kompilierst. Daher fehlen beim Kompilieren einige Symbole.

Wahrscheinlich gibt es eine Option (wiederum arbeite ich nicht mit VS), um die .obj im selben Verzeichnis wie die .cpp-Datei zu belassen. Der Nachteil ist etwas Müll in Ihrer Quellcode-Struktur.

Meine persönliche Meinung wäre Refactoring.

    
Tristram Gräbener 17.02.2010 15:03
quelle