web-dev-qa-db-fra.com

Comment créer un DLL à partir de la ligne de commande dans Windows à l'aide de MSVC

Je fais du C depuis environ 20 ans mais je n'ai jamais construit de DLL; J'ai toujours préféré lier statiquement.

J'utilise la ligne de commande - cl.exe, etc - et les makefiles gnumake, pour construire mes applications Windows.

Je veux maintenant construire un DLL et je suis confus.

En fin de compte, je vais me retrouver avec un .lib et un .dll. Le .lib contient du code de stub qui lors de l'exécution charge le DLL et utilise le code qu'il contient.

J'ai regardé les lignes de commande pour lib et link et il ne me semble pas exactement ce qui est censé être fait pour produire cette sortie.

J'ai donc quelques questions;

Cl a-t-il besoin d'arguments supplémentaires pour indiquer qu'il compile pour une DLL? (Je sais que les DLL prototypes exportés ont besoin de __declspec (dllexport)).

Je sais que le lien doit/dll comme argument.

Vais-je exécuter lib et link, pour produire respectivement .lib et .dll, ou est-ce que link produira les deux?

Que dois-je savoir d'autre?

35
user82238

Il s'avère que cela se produit automatiquement.

Si vous avez exporté des fonctions (par exemple/export, __declspec (dllexport), etc.), l'éditeur de liens générera automatiquement le fichier .lib (vous avez bien sûr besoin de/dll sur la ligne de commande de l'éditeur de liens).

4
user82238

Sur la ligne de commande, utilisez:

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

ou, si vous préférez la version plus détaillée et explicite:

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

Similaire à la réponse d'Ebow Halm, mais en utilisant un fichier .def pour répertorier les fonctions exportées et les arguments de ligne de commande plus récents:

"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

Références:

4
eresonance

Cl a-t-il besoin d'arguments supplémentaires pour indiquer qu'il compile pour une DLL? (Je sais que les DLL prototypes exportés ont besoin de __declspec (dllexport)).

Pas depuis que Win3x est parti, maintenant vous avez juste besoin de __declspec(dllexport) ou d'un fichier .DEF qui définit les noms des symboles que vous souhaitez exporter. un fichier .def vous permet d'exporter des symboles avec des noms modifiés, il peut donc être utile pour des cas particuliers.

Je sais que le lien doit/dll comme argument.

Oui.

Vais-je exécuter lib et link, pour produire respectivement .lib et .dll, ou est-ce que link produira les deux?

lib est utilisé uniquement pour créer des bibliothèques statiques (ou pour ajouter des .objs à votre implib) Link produira à la fois un .dll et un .lib d'importation.

1
John Knoeller

Le moyen le plus simple de le découvrir est de créer un projet MSVC dans lequel vous définissez tout comme vous le souhaitez, puis d'activer la journalisation de génération, de créer une génération et d'analyser le journal de construction pour toutes les commandes et leurs arguments.

0
Sebastiaan M