2009-07-07 4 views
1

Ich verwende MSVC++ 6, um ein sehr großes Projekt zu erstellen. Einige der Quelldateien in diesem Projekt werden für ein kleines Dienstprogramm freigegeben, das wir für die Verwaltung der Anwendung verwenden. Zuvor musste dieses kleine Dienstprogramm mit vielen Bibliotheken aus der Hauptanwendung verknüpft werden und benötigte zur Laufzeit die DLLs der Hauptanwendung. Ich wurde damit beauftragt, diese Abhängigkeiten zu entfernen, was sich ziemlich einfach anhört ... Leider bereiten die vorkompilierten Header, die in der Haupt-App verwendet werden, mir eine Menge Ärger.Umstrukturierungsabhängigkeiten einiger Dateien in einem Projekt mit vorkompilierten Headern verursacht Linkfehler

Ich habe zuerst alle Dateien im Dienstprogramm überarbeitet, um explizit alles einzubeziehen, was sie brauchen, und dann entfernte ich die # include-Direktiven für den PCH (dadurch wurden 95% der unnötigen Abhängigkeiten für das Dienstprogramm entfernt). Dies funktioniert hervorragend zum Kompilieren des Dienstprogramms. Jetzt jedoch gibt mir das Kompilieren der Haupt-App Fehler bezüglich fehlender vorkompilierter Header-Direktiven. Ich dachte "großartig, ich werde den PCH nur bedingt einbeziehen". Dies scheint nicht zu funktionieren ... Ich bekomme "unerwartete #endif", wie erwähnt here. Mein nächster Gedanke war, PCH in der Haupt-App für die drei Quelldateien zu deaktivieren, die zwischen dem Dienstprogramm und der Haupt-App geteilt werden. Dies kompiliert erfolgreich, aber ich ein paar Fehler erhalten, die während der Verknüpfung wie folgt aussehen:

tls7d.lib(tls707d.dll) : error LNK2005: "public: unsigned int __thiscall RWCString::length(void)const " ([email protected]@@QBEIXZ) already defined in stripledescypher.obj 

AFAICT

, alle der mehrfach definierten Symbole sind diejenigen, die ich explizit in den freigegebenen Dateien gehören die Notwendigkeit, dass die PCH zu vermeiden . Meine Vermutung ist, dass, da ich diese drei Dateien in die gleiche DLL wie die PCH .cpp-Datei verknüpfe, sie an mehreren Stellen kompiliert werden. Gibt es einen Ausweg aus dieser Unordnung? Ich werde fast alles versuchen ...

Antwort

1

Wenn der Compiler eine Definition eines Symbol X findet, wenn er eine Kompilierungseinheit bearbeitet, wird es einen Hinweis für den Linker erzeugen: X ist hier drin!

Die Zusammenstellung von zwei Quelldateien, die beide #include einen Header mit einer Definition ing (das heißt keine bloße Deklaration) wird in zwei Dateien Objekt führt das gleiche Symbol definieren. Der Linker findet ein Symbol, das mehrfach definiert ist.

So scheint es, dass Ihre Stripescypher-Objektdatei eine Definition der WCString::lenght()const-Methode enthält. Dies kann daran liegen, dass der Funktionskörper im Header der Klasse oder ähnlich definiert ist.

Verwandte Themen