Wie erstelle ich mit Visual Studio 2008 und seinem C / C ++ - Compiler eine Win32-DLL, die nur von anderen Windows-DLLs abhängig ist und keine Abhängigkeit von der Microsoft-C-Laufzeit hat?
Ich habe einen C-Code, den ich in eine DLL schreiben möchte, die vollständig berechnet ist und fast keine C-Bibliotheksfunktionen verwendet.
Für die, die es verwendet (zB memcpy), bin ich froh, den Code zu überarbeiten, um die Win32-API-Entsprechungen zu verwenden (zB CopyMemory).
Verwenden Sie die Linker-Option / NODEFAULTLIB und stellen Sie (natürlich) sicher, dass Sie keine tatsächlichen Abhängigkeiten zur Laufzeit haben. Sie müssen auch & amp; Definieren Sie Ihren eigenen Einstiegspunkt für die DLL mit der / ENTRY-Linker-Option oder alternativ mit einer eigenen Einstiegspunktfunktion, die mit dem vom Compiler / Linker erwarteten Namen übereinstimmt (für eine DLL ist das _DllMainCRTStartup
).
Matt Pietreks Artikel aus der Zeit vor LIBCTINY wird wahrscheinlich alle Informationen enthalten, die Sie brauchen:
Sie haben möglicherweise mehr Abhängigkeiten von der CRT als Sie denken. Es zieht Ressourcen wie lokalen Threadspeicher ab, und globale Klasseninitialisierer werden von der CRT vor main ().
ausgeführtErwägen Sie die Verknüpfung mit einem statischen CRT, wie jemand sagte, und wenn Sie wirklich nicht wollen, verwenden Sie / NODEFAULTLIB und / ENTRY, wie jemand anders gesagt hat.
Oh, und anstatt memcpy neu zu bearbeiten, sollten Sie den superschnellen Compiler intrinsic verwenden dafür. Sie können intrinsics mit / Oi aktivieren.
für den "Debug" -Modus versuchen Sie dies:
für den "Release" -Modus, führen Sie dieselben Schritte aus, außer dass Sie im letzten Schritt Multi-threaded (/ MT) auswählen.
Dadurch wird jede C-Laufzeitfunktion, die in Ihrem Programm verwendet wird, statisch mit Ihrer Binärdatei verknüpft.
Einige Windows-Bibliotheken hängen von der C-Laufzeit ab (z. B. ODBC32.DLL) also denke ich, dass du dich hier versteckt hast. Warum würdest du das überhaupt machen wollen?
Sie müssen sicherstellen, dass keines der Win32-DLLs, die Sie verwenden, auch die C-Laufzeit benötigt, oder Sie sind auf Platz eins zurück. Das statische Kompilieren Ihrer DLL spielt keine Rolle, wenn eine der Win32-DLLs von der C-Laufzeit abhängt.
Der einzige Weg, wie ich das sehen kann, ist, ALLE Ihre abhängigen DLLs (wenn das überhaupt möglich ist) statisch mit Ihrer DLL zu verknüpfen. Dies bedeutet natürlich, dass Sie neu kompilieren müssen, um DLL-Updates zu nutzen.