Cómo construir una DLL desde la línea de comandos en Windows usando MSVC

3 minutos de lectura

He estado haciendo C durante unos 20 años, pero nunca he creado una DLL; Siempre he preferido enlazar estáticamente.

Utilizo la línea de comandos (cl.exe, etc.) y los archivos MAKE de gnumake para compilar mis aplicaciones de Windows.

Ahora quiero construir una DLL y estoy confundido.

En última instancia, terminaré con un .lib y un .dll. El .lib contiene un código auxiliar que, en tiempo de ejecución, carga la DLL y usa el código que contiene.

He estado mirando las líneas de comando para lib y link y no veo exactamente qué se supone que se debe hacer para producir este resultado.

Así que tengo algunas preguntas;

¿Cl necesita argumentos adicionales para indicar que se está compilando para una DLL? (Sé que los prototipos exportados de DLL necesitan __declspec (dllexport)).

Sé que el enlace necesita /dll como argumento.

¿Ejecutaré lib? y link, para producir .lib y .dll respectivamente, o link producirá ambos?

¿Qué más necesito saber?

avatar de usuario
Ebow Halm

En la línea de comando usa:

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

o, si prefiere la versión más detallada y explícita:

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

  • Gracias: no es posible conocer las “_D” que espera Windows sin usar MSVC para crear un proyecto.

    usuario82238

    7 de enero de 2011 a las 20:22

  • EN MI HUMILDE OPINIÓN, _USRDLL y _WINDLL no son necesarios, simplemente use /LD sin pase /DLL, /OUT al enlazador por /link.

    – nn0p

    5 de septiembre de 2015 a las 12:46


  • Felicitaciones a @ nn0p: ha encontrado el real documentado cambie para hacer una compilación a DLL con cl; la “solución” original de Ebow Halm parece un truco crudo en comparación, en mi opinión.

    usuario719662

    12 abr 2016 a las 17:39


  • Nota: /LD distingue entre mayúsculas y minúsculas, a diferencia de muchas otras opciones en los programas de Windows.

    – Sinvergüenza

    13 oct 2020 a las 19:08

Resulta que sucede automáticamente.

Si ha exportado funciones (p. ej., /export, __declspec(dllexport), etc.), el enlazador generará automáticamente el archivo .lib (por supuesto, necesita /dll en la línea de comandos del enlazador).

  • de hecho, es mejor usar un archivo de definiciones de módulo, porque eso le permite usar prototipos sin __declspec (dllexport), que a su vez le permite usar el archivo de encabezado original del dll que está conectando

    usuario82238

    17 de julio de 2009 a las 12:29

Similar a la respuesta de Ebow Halm, pero usando un archivo .def para enumerar las funciones exportadas y los argumentos de línea de comando más nuevos:

"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

Referencias:

¿Cl necesita argumentos adicionales para indicar que se está compilando para una DLL? (Sé que los prototipos exportados de DLL necesitan __declspec (dllexport)).

No desde que Win3x desapareció, ahora solo necesitas cualquiera __declspec(dllexport) o un archivo .DEF que define los nombres de los símbolos que desea exportar. un archivo .def le permite exportar símbolos con nombres modificados, por lo que aún puede ser útil para casos especiales.

Sé que el enlace necesita /dll como argumento.

Sí.

¿Ejecutaré lib y link para producir .lib y .dll respectivamente, o link producirá ambos?

lib se usa solo para crear bibliotecas estáticas (o para agregar .objs a su implib) Link producirá tanto un .dll como un import .lib para él.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad