Frage

Ich versuche, eine C ++ Bibliothek für den Einsatz auf Windows / MSVC zu erstellen.

Mein Problem ist, dass es, dass richtig, um scheint zu verbinden, ich brauche eine Reihe von verschiedenen Versionen, verknüpfen gegen verschiedene Versionen von MSVC des c ++ Runtimes zu verteilen - Einzel- und Multi-Threaded, Debug und Release, verschiedene Compiler-Versionen, verschiedene andere Sicherheits und andere Optionen.

Ich würde gerne nur vielleicht zwei verteilen, 32 Bit und 64 Bit.

Meine Idee ist es, vielleicht einen anderen neuen Operator (sagen wir, mynew) und benutzerdefinierte Verteilern für alle meine STL-Typen. Wenn die lib Erstellen / NODEFAULTLIB. Wenn dann von einem übergeordneten Projekt verbindet in, benötigen sie mynew neue Thunk, und mein stl Allocator dem Standard eines (oder einer ihrer Wahl). Ich glaube, ich würde tun müssen, um zu löschen, und ein paar andere Funktionen. Natürlich würde ich ein Beispiel nennt Umsetzung mit der Bibliothek Thunk, aber dies würde hoffentlich jeder eine Menge Kopfschmerzen speichern.

Ist das möglich? Hat jemand dies jemals versucht? Gibt es eine Best Practices für die Bibliothek Erstellung / Verteilung auf Windows / MSVC?

War es hilfreich?

Lösung

Sie mögen statisch Linken, als eine allgemeine Antwort.

Kurze Notiz auf Chris' Antwort (will nicht de-Boost weil es meistens gut ist, aber ...):

Link NICHT (die unversionierte eins) zu msvcrt.dll; dies ist die OS-spezifische Version DLL, und wenn Sie es verknüpfen, Ihre App wird wahrscheinlich nicht auf anderen Versionen von Windows arbeiten. Sie sollten immer ##. Dll MSVCRT werden verknüpft, soweit ich weiß. Das DDK eine lib dafür enthalten, aber keine Verbindung zwischen ihm, wenn Sie wirklich wissen, was Sie tun.

Andere Tipps

Link statisch auf C ++ Laufzeitbibliothek:

  1. Öffnen Projekteigenschaften.
  2. Gehen Sie zu Konfiguration Eigenschaften | C / C ++ | Codegenerierung Abschnitt.
  3. Set-Laufzeitbibliothek auf Multi-Threaded (/ MT).

Sie brauchen nicht eine benutzerdefinierte allocator zu verwenden, wenn Sie C ++ verwenden, und Sie alle Zuordnungen um std::tr1::shared_ptr wickeln (in dem Sie eine Freigabe-Funktion angeben). Dadurch wird sichergestellt, dass selbst dann, wenn Kunden die letzte Referenz auf den freigegebenen Zeiger freigeben, es ist immer noch Code in Ihrer Bibliothek (oder CRT Ihrer Bibliothek), die aufgerufen wird, wenn das Objekt befreit werden.

Dies ist eine Möglichkeit „DLL Grenze hell“ zu lösen. Ich hoffe es hilft! : -)

Edit: Ich denke, dass ich die Absicht Ihrer Frage falsch verstanden. Anstatt keine Abhängigkeit von einem CRT zu wollen, weil Sie über DLL Grenze Hölle besorgt sind, nehme ich Sie nur eine Version Ihres DLL wollte, die Sie überall installieren können. In diesem Fall können Sie Ihr Programm Link msvcrt.dll machen. Das ist auf jedem Windows-System.

Sie haben das nicht von mir hören, aber offenbar in dem Driver Development Kit können Sie irgendeine Art von Import-Bibliothek finden, die neueren Versionen von Visual Studio ermöglicht eine Verknüpfung msvcrt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top