Ich arbeite an einem C++-Projekt, das Qt (GUI-Library), VTK (Graphics-Library) und eine andere Bibliothek verwendet, die so obskur ist, dass ich ihren Namen nicht erwähnen werde und stattdessen LIB_X nennen werde. Das Projekt verwendet Qt für die GUI-Komponenten und VTK (genauer gesagt die von VTK bereitgestellte QVTKWidget-Erweiterung, die Qt unterstützt) zur Darstellung der Geometrie... und es verwendet LIB_X, um Geometrie zu sammeln und zu manipulieren.
Das Problem ist, dass sich herausstellt, dass LIB_X tatsächlich VTK verwendet (wo und wie, weiß ich nicht, es ist Closed Source). Anfangs gab es kein Problem, das Kompilieren mit beiden Bibliotheken verlief gut, aber irgendwann habe ich eine bestimmte (und dringend benötigte) LIB_X-Funktion aufgerufen und das Kompilieren führte zu einer Vielzahl von Fehlern wie 'bla bla etwas über eine in der LIB_X-DLL bereits definierte VTK-Lib/Objekt'.
Zum Beispiel (und beachten Sie, dass dies mit /FORCE:MULTIPLE ist, also nur eine Warnung hier, lassen Sie mich wissen, wenn Sie den Fehler ohne /FORCE:MULTIPLE möchten, und ich werde ihn posten):
1>LIB_X.lib(LIB_X.dll) : warning LNK4006: "public: __thiscall std::vector >::~vector >(void)" (??1?$vector@NV?$allocator@N@std@@@std@@QAE@XZ) already defined in vtkCommon.lib(vtkInformationDoubleVectorKey.obj);
Ich habe versucht, /FORCE:MULTIPLE zu verwenden, und es schien zuerst ein Wunder zu sein, aber ich bekomme zufällige Fehler im Code, die meistens Heap-Fehler verursachen. Ich habe beschlossen, alle Verweise auf LIB_X aus dem Hauptprojekt zu entfernen und eine statische Bibliothek zu erstellen, die sich um alle LIB_X-Angelegenheiten kümmern würde. Ich bin kein C++-Experte, daher bin ich mir nicht sicher, wie es mit Bibliothekskollisionen umgeht, wenn Sie eine vorkompilierte Bibliothek verwenden, aber ich habe immer noch Bibliothekskollisionsfehler erhalten, als ich meine statische Bibliothek in mein Hauptprojekt eingebunden habe, also muss ich immer noch /FORCE:MULTIPLE verwenden.
Nachdem ich die statische Bibliothek hatte, schien es, als wären die zufälligen Fehler verschwunden. Ich konnte viele Dinge mit LIB_X-Methoden im Hauptprojekt über die statische Bibliothek machen, ABER aus dem Nichts habe ich einem neuen Datenmember zur Klasse meines Hauptprojekts hinzugefügt (eine std::vector von doubles) und plötzlich bekam ich einen Heap-Fehler in einer meiner Methoden der statischen Bibliothek. Wenn ich den neuen Datenmember auskommentiert habe, lief die Methode der statischen Bibliothek gut. Ich möchte den aktuellen Fehler nicht angeben, weil ich ehrlich gesagt nicht sicher bin, ob es sich lohnt, ihn zu untersuchen, aber hier ist er trotzdem, falls er hilfreich sein kann:
Beachten Sie: es stürzt auf xutility in etwa Zeile 151 ab mit der Assertion: "Datei: dbgheap.c Zeile: 1279 Ausdruck: _CrtIsValidHeapPointer(pUserData)"
Der Fehler tritt nach dem Hinzufügen eines Vektor-Vektors double zu einem Vektor-Vektor-Vektor double auf und stürzt beim push_back ab:
std::vector> tmpVec;
for(srvl_iter = srvl.begin(); srvl_iter != srvl.end(); ++srvl_iter)
{
tmpVec.push_back((*srvl_iter).getControlPoints());
}
this->_splines.push_back(tmpVec); //ABSTURZ
Es begann erst hier abzustürzen, als ich einen neuen Datenmember zu meinem Hauptprojekt hinzugefügt habe (getrennt von der statischen Bibliothek!) Das Auskommentieren des neuen Datenmitglieds hebt den Fehler auf.
std::vector>> _geometry;
Also, /FORCE:MULTIPLE scheint schlecht zu sein, ich bekomme zufällige Fehler, die für mich keinen Sinn ergeben. Gibt es andere Lösungen? Bin ich verloren? Kann ich etwas mit der Verlinkung von VTK durch LIB_X machen?