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.
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
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.
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.
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.
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.
Tags und Links c++ visual-studio-2008 visual-c++ visual-c++-2008 linker-errors