Frage

Ich weiß nicht, ob es möglich ist, dies zu tun, aber ich möchte, dass die /nodefaultLib auf ein statisches Bibliotheksprojekt angewendet wird.

Ich habe viele Anwendungsprojekte (A.Exe, B.Dll, C.Dll), die eine gemeinsame statische Bibliothek d.lib verwenden. Diese Bibliothek hat viel Code und auch andere .lib -Abhängigkeiten. Eine davon ist die OpenSSL -Bibliothek, die für Win32 gegen die Release -Version des CRT gebaut worden zu sein scheint (ich habe nicht das ursprüngliche Projekt/die ursprünglichen Quellen).

Um das Mischen der Versions- /Debug -Versionen von CRT zu vermeiden, muss ich die Anweisung /NodeFaultLib:MSVCRT.LIB -Linker in allen Blattprojekten (A.exe, B.Dll) einfügen. Dies funktioniert, aber ich denke, es ist nicht die ideale Art, mit diesem Problem umzugehen. Ich habe versucht, dieses Eigentum in das D.Lib -Projekt zu setzen, aber es hat keine Wirkung.

Gibt es eine Möglichkeit, MSVC ++ zu zwingen, die Abhängigkeit von msvcrt.lib aus der Bibliothek der 3. Partei zu ignorieren?

War es hilfreich?

Lösung

Ein .lib hat keine Linker -Einstellungen, da Sie es nicht verknüpfen, Sie verlinken Sie zu es. A .lib ist nur ein Archiv von .obj -Dateien, ähnlich wie eine unkomprimierte .zip -Datei - deshalb müssen Sie die Einstellung auf alle Projekte einsetzen, die darauf verknüpfen.

Wenn Sie VS2005+ verwenden, können Sie Eigenschaftsblätter verwenden, damit Sie die Einstellung nur an einem Ort einsetzen und dieses Eigenschaftsblatt in allen Projekten verwenden müssen.

OpenSSL ist jedoch genau das - Open Source. Sie sollten also in der Lage sein, die Quelle für die Version zu erhalten, die Sie verwenden, und erstellen Sie sie natürlich zu Ihrem Versionskontrollsystem). Ich dachte, OpenSSL könnte als DLL oder LIB gebaut werden, was Ihr Problem lösen würde, da die DLL die Verknüpfung Ihres Codes nicht beeinträchtigen würde.

Wenn Sie dies nicht haben, haben Sie immer die Möglichkeit, Ihre Funktionalität in eine separate DLL zu bringen, damit Sie nur Probleme mit einem Projekt haben.

Andere Tipps

Mein Verständnis ist, dass die DLL bereits alle relevanten Code von LIB enthält, wenn die Bibliothek LIB statisch in eine DLL verlinkt. Daher kann diese Kopplung nicht entfernt werden. Dies basiert nur auf meinem Verständnis der statischen Verknüpfung, nicht auf Experimenten.

Um zu verhindern, dass Ihre verteilte statische Linkbibliothek von einer bestimmten MSVC -Laufzeitbibliothek abhängt, müssen Sie diese Compiler -Option festlegen (in Visual Studio 2010 sieht es aus):

Konfigurationseigenschaften -> C/C ++ -> Erweitert -> Standardbibliotheksname auslassen = Ja (/Zi)

Jetzt können Ihre Benutzer aus ihrem Debug -Build mit Ihrer Veröffentlichung statische LIB verlinken und nicht versuchen, auf die falsche Laufzeitbibliothek zu verknüpfen, die Probleme sowie Warnungen für Linker verursachen.

Beachten Sie, dass dies zu Linkfehlern führen kann, wenn Ihre Bibliothek tatsächlich von einer bestimmten Laufzeitbibliothek oder ihrem Verhalten abhängt, und kompatible Komponenten werden nicht auf andere Weise bereitgestellt.

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