2012-08-27 14 views
9

Ich arbeite an den 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 z.B. https://stackoverflow.com/a/5560184/890355). Das Problem ist, dass das endgültige Projekt unter VS 2008 gebaut werden muss.Verwenden Sie VC++ 2010 Laufzeitbibliotheken in VC++ 2008 Projekt

Die Lösung, die ich dazu tendiere, ist es, meinen Algorithmus als DLL in VS 2010 zu bauen 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.

+0

Die C++ Compiler von Visual Studio verwendet, nicht C++ 0x unterstützt, wenn das ist, was Sie fordern. Natürlich könnten Sie immer einen neueren Compiler verwenden, wenn Sie ein Upgrade auf Visual Studio 2010 und/oder Visual Studio 2012 vermeiden möchten. Eine mögliche Lösung besteht darin, den Optimierungsalgorithmus selbst mit einem anderen Compiler zu kompilieren und nur auf die von diesem Compiler erzeugte Ausgabe zu verweisen . –

+2

Übergeben Ihre Bibliotheken Objekte untereinander und erwarten voneinander, dass sie ihre Zuordnung aufheben?Das Mischen von Bibliotheken mag funktionieren, aber es gibt einige ziemlich einschränkende Vorbehalte (und die Verwendung der C++ - Container kann zu schlechter Magie führen): http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in -vs2008 - Kurz gesagt, es ist einfacher, wenn Sie alles konsistent halten und nur eine C++ - Laufzeit verwenden können. – birryree

+3

Dies kann nur zu einem guten Ende kommen, wenn Sie die Dateien #include von VS2010 verwenden. Was nicht funktioniert, VS2008 kann sie nicht kompilieren, besonders, da Sie nach der Verbesserung der Bewegungssemantik perfektioniert sind. –

Antwort

1

Wenn Sie für eine andere Möglichkeit zur Kombination von 2008 und 2010 Bibliotheken in einer ausführbaren Datei als Verschieben 2010 Teil außerhalb in eine DLL, als die Antwort ist wahrscheinlich "Es gibt keinen anderen einfachen Weg, dies zu erreichen".

Aber wenn Sie nicht wollen "VC++ 2010 Laufzeitbibliotheken ... unter VS 2008" (das baut gegen 2010 Bibliotheken in der alten 2008 IDE), 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, ist (statisch verknüpfte Standardbibliotheken (MFC, wenn Sie es verwenden) (.exe und DLL) zu erstellen und dann LoadLibrary in Ihrer .exe zu laden DLL. In der DLL können Sie (_declspec (dllexport)) eine Funktion (vorzugsweise innerhalb extern "C" {} Wächter) exportieren und in der .exe durch GetProcAddress verwenden.

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

Wenn Sie sich Sorgen machen über das Laden von DLLs und das Aufrufen von Kosten, können Sie versuchen, diese Aufrufe so selten wie möglich zu machen (indem Sie nicht nur den Algorithmus, sondern auch einige höhere Logik in die DLL verschieben). Siehe auch this issie.

Und Sie können Ihren gesamten Code in einer IDE (2010) unter Verwendung native multitargeting bauen (jedoch müssen Sie immer noch Ihre Haupt-App und DLL getrennt gegen v9 und v10 Bibliotheken jeweils erstellen).

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 könnte auch Over-Kill, wenn die Schnittstelle ist einfach.)

Verwandte Themen