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?
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
Ä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).
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.
Dieser Blogbeitrag ist unkompliziert und zeigt sogar
ctypes
Zugriff von Python: albertech.blogspot.com/2014/12/…– Krug
27. Januar 2015 um 23:54 Uhr