So erstellen Sie eine DLL über die Befehlszeile in Windows mit MSVC

Lesezeit: 3 Minuten

Ich arbeite seit etwa 20 Jahren mit C, habe aber noch nie eine DLL erstellt. Ich habe es immer vorgezogen, statisch zu verlinken.

Ich verwende die Befehlszeile – cl.exe usw. – und Gnumake-Makefiles, um meine Windows-Anwendungen zu erstellen.

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

Letztendlich werde ich sowohl eine .lib als auch eine .dll haben. Die .lib enthält Stubcode, 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 getan werden soll, um diese Ausgabe zu erzeugen.

Ich habe also einige 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ß, dass Link / dll als Argument benötigt.

Werde ich lib ausführen und link, um die .lib bzw. .dll zu erzeugen, oder wird link beides erzeugen?

Was muss ich sonst noch wissen?

Benutzeravatar von Ebow Halm
Ebow Halm

Verwenden Sie in der Befehlszeile:

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

oder, wenn Sie die ausführlichere und explizitere Version bevorzugen:

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

  • Danke – es ist nicht möglich, die von Windows erwarteten “_D” zu kennen, ohne MSVC zum Erstellen eines Projekts zu verwenden.

    Benutzer82238

    7. Januar 2011 um 20:22 Uhr

  • MEINER BESCHEIDENEN MEINUNG NACH, _USRDLL und _WINDLL sind kein Muss, einfach verwenden /LD ohne Pass /DLL, /OUT zum Linker durch /link.

    – nn0p

    5. September 2015 um 12:46 Uhr


  • Kudos gehen an @nn0p – du hast das gefunden tatsächlich dokumentiert Wechseln Sie zur DLL-Kompilierung mit cl; Die ursprüngliche “Lösung” von Ebow Halm scheint im Vergleich dazu meiner Meinung nach ein grober Hack zu sein.

    Benutzer719662

    12. April 2016 um 17:39 Uhr


  • Hinweis: Bei /LD wird im Gegensatz zu vielen anderen Optionen in Windows-Programmen zwischen Groß- und Kleinschreibung unterschieden.

    – Schurke

    13. Oktober 2020 um 19:08 Uhr

Ähnlich wie die Antwort von Ebow Halm, aber Verwendung einer .def-Datei zum Auflisten der exportierten Funktionen und 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

Verweise:

Es stellt sich heraus, dass es automatisch passiert.

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

  • Tatsächlich ist es am besten, eine Moduldefinitionsdatei zu verwenden, da Sie damit Prototypen ohne __declspec(dllexport) verwenden können, wodurch Sie wiederum die ursprüngliche Header-Datei der DLL verwenden können, die Sie einhängen

    Benutzer82238

    17. Juli 2009 um 12:29 Uhr

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

Nicht seit Win3x verschwunden ist, jetzt brauchen Sie nur noch beides __declspec(dllexport) oder eine .DEF-Datei, die die Namen der zu exportierenden Symbole definiert. Eine .def-Datei ermöglicht es Ihnen, Symbole mit geänderten Namen zu exportieren, sodass sie für Sonderfälle immer noch nützlich sein kann.

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

Ja.

Werde ich lib und link ausführen, um die .lib bzw. .dll zu erzeugen, oder wird link beides erzeugen?

lib wird nur verwendet, um statische Bibliotheken zu erstellen (oder um .objs zu Ihrer implib hinzuzufügen). Link erzeugt sowohl eine .dll als auch eine Import-.lib dafür.

1407890cookie-checkSo erstellen Sie eine DLL über die Befehlszeile in Windows mit MSVC

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy