Verwenden Sie VC ++ 2010-Laufzeitbibliotheken im VC ++ 2008-Projekt

9

Ich arbeite an dem Optimierungsalgorithmus, so dass die Leistung wirklich zählt. Der Algorithmus ist etwa 8-mal schneller, wenn er in VS 2010 im Vergleich zu VS 2008 kompiliert wird. Googling zeigt, dass es nicht meine Schuld ist (siehe zB Ссылка ). Das Problem ist, dass das endgültige Projekt unter VS 2008 gebaut werden muss.

Die Lösung, die ich tendiere, besteht darin, meinen Algorithmus als DLL in VS 2010 zu erstellen und ihn dann mit dem Hauptprojekt zu verknüpfen. Ist es möglich, VC ++ 2010 Laufzeitbibliotheken mit meiner DLL unter VS 2008 zu verwenden? Wenn ja, was ist der am wenigsten schmerzhafte Weg? Irgendwelche anderen Ideen? Danke.

    
AdelNick 27.08.2012, 13:39
quelle

3 Antworten

1

Wenn Sie nach einer anderen Möglichkeit suchen, die Bibliotheken 2008 und 2010 in einer anderen ausführbaren Datei zu kombinieren, als 2010 in eine DLL zu verschieben, lautet die Antwort wahrscheinlich "Es gibt keinen anderen einfachen Weg, dies zu erreichen".

Aber wenn Sie nicht wollen "VC ++ 2010 Laufzeitbibliotheken ... unter VS 2008" (das gegen 2010 Bibliotheken in der alten 2008 IDE baut), aber "verwenden Sie eine 2010-kompilierte DLL in Ihrem 2008- kompiliertes Programm ", ist es durchaus möglich.

Der einfachste Weg, wie wir es in unseren Projekten tun, besteht darin, (sowohl .exe als auch DLL) gegen statisch verknüpfte Standardbibliotheken (MFC, wenn Sie sie verwenden) zu erstellen und dann LoadLibrary in Ihrer .exe zu laden die DLL. In der DLL können Sie eine Funktion exportieren ( _declspec (dllexport) ) (vorzugsweise in extern "C" {} guards) und in der .exe über GetProcAddress verwenden.

Statische Verknüpfung und explizites Laden ersparen Ihnen viele Inkonsistenzfehler, die durch unterschiedliche Laufzeiten verursacht werden.

Wenn Sie sich Sorgen machen, dass DLLs geladen werden und die Kosten von Funktionen aufgerufen werden, können Sie versuchen, diese Aufrufe so selten wie möglich zu machen (indem Sie nicht nur den Algorithmus, sondern auch einige weitere High-Level-Logiken in die DLL verschieben). Siehe auch this issie .

Und Sie können Ihren gesamten Code in einer IDE (2010) erstellen, indem Sie natives Multitargeting (allerdings müssen Sie Ihre Hauptanwendung und DLL separat gegen v9- bzw. v10-Bibliotheken erstellen).

    
Steed 27.08.2012, 14:39
quelle
3

Die Laufzeiten sind kein Problem. Nichts hält Sie davon ab, Ihre DLL mit der VC2010-Laufzeit zu verbinden und diese DLL dann in anderen Projekten zu verwenden. Es spielt keine Rolle, ob diese Projekte mit Visual C ++ 2008 oder einer anderen Sprache erstellt werden.

Der schwierige Teil ist das Entwerfen der DLL-Schnittstelle. Das einfache Exportieren einiger C ++ - Klassen ist riskant, da Sie dadurch Inkompatibilitäten zwischen den verschiedenen Compilern erfahren. Ich denke, Ihre beste Wette wäre, entweder eine C-Stil-Schnittstelle verfügbar zu machen oder COM zu verwenden. Ich denke, COM ist der beste Ansatz, aber wenn Sie mit der Technologie nicht vertraut sind, dann wird eine C-Style-Schnittstelle gut funktionieren. (COM kann auch überschrieben werden, wenn die Schnittstelle einfach ist.)

    
Peter Ruderman 27.08.2012 14:09
quelle
1

Sie können, wenn Sie vorsichtig sind, und die MS-Dokumentation bietet einige Hinweise. Ich habe diese Frage schon vorher beantwortet:

Sie fragen sich, ob die niedrigere Version von Visual Studio die DLL verwenden kann, die mit einer höheren Version von Visual Studio erstellt wurde?

    
user52875 27.08.2012 15:19
quelle