3

Ich werde mit einer C++ - Bibliothek arbeiten, die in C++ geschrieben ist (nicht .NET und ohne MFC). Die Bibliothek ist kompiliert mit Visual Studio 2005/Intel Fortran 9.1 und VS 2008/Intel Fortran 10.1 verfügbar.Kann eine mit Visual Studio 2008 kompilierte C++ - DLL mit Visual Studio 2005 verwendet werden?

Offensichtlich werde ich die Binärdateien für VS 2008 greifen, da das die Umgebung auf meinem Computer ist, aber ich bin neugierig, wenn es Gründe gibt, warum eine gerade C++ Bibliothek zwischen VS 2005 und 2008 nicht kompatibel wäre. d nehme an, dass der Name-Mangling der gleiche wäre, aber vielleicht gibt es andere Gründe. Ich habe C++ schon lange nicht mehr benutzt, daher bin ich ein wenig eingerostet, wenn es um diese Dinge geht.

Antwort

2

Das größte Problem, auf das Sie stoßen werden, ist die Verwendung des CRT. Wenn das CRT (C RunTime) statisch in der DLL verknüpft ist, sollten Sie keine Probleme haben.

Wenn jedoch die CRT dynamisch in das Projekt eingebunden ist, kann es zu Problemen kommen. Visual Studio 2005 und 2008 verwenden verschiedene Versionen des CRT und sie können nicht problemlos zusammen geladen werden. Aber wenn eine oder beide der DLLs die CRT statisch verbinden, sollten Sie in einer anständigen Form sein.

+0

Danke. Ich habe diesen Artikel gefunden, in dem einige Probleme mit der Verknüpfung von http://msdn.microsoft.com/en-us/library/ms235460.aspx beschrieben werden. Die Bibliothek, die ich habe, ist im Grunde eine Datei-I/O-Bibliothek, so dass eine dynamische Verknüpfung wahrscheinlich eine bessere Idee ist (je nachdem, wie sie verwendet wird). –

+0

Und ich habe es nur mit Dumpbin/importiert und die Bibliothek ist dynamisch mit der CRT verbunden. –

3

Es sollte wahrscheinlich funktionieren. Die DLL, die mit VS 2005 kompiliert wird, wird von VS 2005-Implementierung der C-Standardbibliothek (msvcr80.dll) abhängen, während Ihr Code von VS 2008 C-Bibliothek (msvcr90.dll) abhängt. Dies bedeutet, dass zur Laufzeit beide Versionen der C-Bibliotheken geladen werden, was in Ordnung ist, aber es erhöht Ihre Speicherauslastung und verlangsamt Ihre Ladezeit um einen sehr kleinen Betrag.

+0

Dies ist nur in Ordnung, wenn Sie nicht versuchen, CRT-Objekte (Speicher, Dateihandles) zwischen den zwei CRT-Bibliotheken zu ändern. Beispielsweise ist das Zuweisen von Speicher in * 80.dll und das Bearbeiten von * 90.dll in Ordnung, aber das Freigeben oder Neuzuweisen in * 90.dll ist NICHT. Debuggen vs. Release verhalten sich ähnlich. –

3

Wie die anderen Poster kommentiert haben, sollten Sie in der Lage sein, auf diese Weise zu arbeiten.

Es gibt jedoch ein Problem, das eine große sein kann - Speicherverwaltung. Insbesondere die C++ - Laufzeiten können schwierig sein.

Das größte Problem ist, dass es einige Inkompatibilitäten zwischen den Laufzeiten 2005 und 2008 gibt. Alles funktioniert gut, vorausgesetzt, Sie ordnen Ihren Speicher immer in Ihrer VS2008-DLL zu und löschen immer den von dort innerhalb Ihrer DLL zugewiesenen Speicher. Dies erfordert in der Regel einige "zusätzliche" Factory- und Cleanup-Methoden in Ihrer DLL und diese zu offenbaren.

Wenn Sie Speicher aus Ihrer VS 2008 DLL zuweisen, dann löschen Sie es aus Code, der mit VS 2005 kompiliert wurde, oder umgekehrt, können Sie auf einige sehr schwierig zu debuggende Probleme stoßen. Es wird oft funktionieren, aber zufällige Abstürze oder Instabilitäten haben.