Wie erstelle ich eine Win32-DLL ohne Abhängigkeit von der C-Laufzeit

8

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).

    
John McAleely 14.08.2009, 18:04
quelle

7 Antworten

10

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:

Michael Burr 14.08.2009, 18:27
quelle
5

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ührt

Erwä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.

    
Drew Hoskins 14.08.2009 18:32
quelle
4

Das /NODEFAULTLIB -Linker-Flag ist nicht das richtige Flag. Es ignoriert alle Standard-Bibliotheken, einschließlich anderer wie uuid.lib .

Was Sie wollen, ist die /Zl -Compiler-Option, "den Standard-Bibliotheksnamen in .OBJ auslassen".

    
Koro 20.08.2009 21:26
quelle
4

für den "Debug" -Modus versuchen Sie dies:

  1. Gehe zu Projekt \ [Projektname] Eigenschaften ...
  2. Öffnen Sie Konfigurationseigenschaften
  3. Öffnen Sie C / C ++
  4. Öffnen Sie Codegenerierung
  5. Für Laufzeitbibliothek Wählen Sie Multithread-Debug (/ MTd) statt Multithread-Debug-DLL (/ MDd)

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.

    
Isaac 25.08.2009 17:38
quelle
0

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?

    
anon 14.08.2009 18:20
quelle
0

Kompilieren Sie es mit statischer Microsoft-Bibliothek.

    
CiNN 14.08.2009 18:24
quelle
0

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.

    
Kelly S. French 14.08.2009 18:29
quelle

Tags und Links