2009-07-15 1 views
26

Ich mache C seit etwa 20 Jahren, aber ich habe noch nie eine DLL gebaut; Ich habe es immer vorgezogen, statisch zu verknüpfen.Wie erstellt man eine DLL von der Kommandozeile in Windows mit MSVC

Ich benutze die Befehlszeile - cl.exe, etc - und gnumake makefiles, um meine Windows-Anwendungen zu erstellen.

Ich möchte jetzt eine DLL erstellen und ich bin verwirrt.

Letztendlich werde ich mit einer .lib und einer .dll enden. Die .lib enthält Stub-Code, der zur Laufzeit die DLL lädt und den darin enthaltenen Code verwendet.

Ich habe mir die Befehlszeilen für lib und link angesehen und es ist mir nicht klar, was genau gemacht werden soll, um diese Ausgabe zu erzeugen.

Also habe ich ein paar Fragen;

Benötigt cl zusätzliche Argumente, um anzuzeigen, dass es für eine DLL kompiliert? (Ich weiß, dass die exportierten DLL-Prototypen __declspec (dllexport) benötigen).

Ich weiß Link benötigt/dll als Argument.

Wird ich lib und Link ausführen, um die .lib bzw. .dll zu erzeugen, oder wird Link beide produzieren?

Was muss ich sonst noch wissen?

+2

Dieser Blogbeitrag ist einfach und zeigt sogar 'cty Pes 'Zugang von Python: http://albertech.blogspot.com/2014/12/how-to-compile-dll-using-clexe.html – jar

Antwort

3

Es stellt sich heraus, geschieht es automatisch.

Wenn Sie Funktionen exportiert haben (z. B./export, __declspec (dllexport) usw.), erzeugt der Linker automatisch die .lib-Datei (Sie benötigen natürlich/dll in der Linker-Befehlszeile).

+0

in der Tat, ist es am besten ein Modul Definitionsdatei zu verwenden, da, dass Sie erlaubt Prototypen zu verwenden, ohne __declspec (dllexport), was wiederum ermöglicht es Ihnen, die ursprüngliche Header-Datei der DLL verwenden Sie 're hooking –

0

Der einfachste Weg, dies herauszufinden, besteht darin, ein MSVC-Projekt zu erstellen, in dem Sie alles nach Belieben einstellen, Build-Logging aktivieren, Build erstellen und das Buildlog für alle Befehle und ihre Argumente analysieren.

+1

Ja. Dies beinhaltet jedoch die Installation der MSVC-GUI - die einen nicht unbeträchtlichen Zeitraum in Anspruch nehmen wird und mit hoher Wahrscheinlichkeit meine derzeitige Systembaukonfiguration aushöhlen wird; und all das einfach, um ein einzelnes Projekt zu erstellen, damit ich die Projektdateien untersuchen kann. –

+0

Stimmt, aber Sie können nicht genauer als das bekommen. Wenn Sie eine VM verwenden, werden Sie nichts verunsichern, aber ja, das braucht noch mehr Zeit. :) Grüße, Sebastiaan –

30

Auf der Kommandozeile verwenden:

cl.exe /LD <files-to-compile> 

oder, wenn Sie die ausführlichere & explizite Version bevorzugen:

cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll 
+0

Danke - es ist nicht möglich, die "_D" s zu kennen, die Windows erwartet, ohne MSVC zu verwenden, um ein Projekt zu erstellen. –

+2

IMHO, '_USRDLL' und' _WINDLL' sind nicht nötig, benutzen Sie einfach '/ LD' ohne pass'/DLL', '/ OUT' zum Linker mit'/link'. – nn0p

+0

Kudos gehen zu @ nn0p - Sie haben die * tatsächlich dokumentiert * Schalter zu DLL-Kompilierung mit Cl zu tun; Die ursprüngliche "Lösung" von Ebow Halm scheint im Vergleich zu IMO ein grober Hack zu sein. – vaxquis

1

cl braucht keine zusätzlichen Argumente, um es zu zeigen kompiliert für eine DLL? (Ich weiß, dass die exportierten DLL-Prototypen __declspec (dllexport) benötigen).

Nicht da ging Win3x, jetzt weg müssen Sie nur gerade so oder __declspec(dllexport) oder eine DEF-Datei, die die Namen der Symbole definiert Sie exportiert werden sollen. Eine .def-Datei ermöglicht es Ihnen, Symbole mit geänderten Namen zu exportieren, sodass sie auch in besonderen Fällen nützlich sein kann.

Ich weiß Link benötigt/dll als Argument.

Ja.

Wird ich lib und link ausführen, um die .lib bzw. .dll zu erzeugen, oder wird Link beide erzeugen?

lib verwendet wird, nur statische Bibliotheken zu erstellen (oder .objs zu Ihrem implib hinzufügen) Verbindung sowohl eine DLL produzieren und einen Import Lib dafür.

2

Simlar zu Ebow Halms Antwort, aber eine DEF-Datei mit den exportierten Funktionen für das Auflisten und die neueren Befehlszeilenargumente:

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def 

Referenzen: