He estado haciendo C durante unos 20 años, pero nunca he construido un archivo DLL; siempre he preferido a enlazar estáticamente.

Puedo usar la línea de comandos – cl.exe, etc – y gnumake makefiles, para construir mis aplicaciones de Windows.

Ahora quiero generar un archivo DLL y estoy confundido.

Finalmente, voy a acabar con ambos .lib y un .dll. El .lib contiene el código auxiliar que en tiempo de ejecución se carga la DLL, y usa el código de los mismos.

He estado buscando en las líneas de comando para la lib y el enlace y no es evidente para mí exactamente lo que se supone que debe hacer, para producir este resultado.

Así que tengo algunas preguntas;

Hace cl necesita de argumentos, para indicar que es la compilación de un archivo DLL? (Sé que el archivo DLL se exportan prototipos necesidad __declspec(dllexport)).

Sé enlace necesidades /dll como un argumento.

Voy a ejecutar lib y enlace, para producir el .lib y .dll respectivamente, o se enlace producir tanto?

¿Qué más necesito saber?

InformationsquelleAutor | 2009-07-15

5 Comentarios

  1. 36

    En la línea de comandos de uso:

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

    o, si se prefiere la más detallado & versión explícitos:

    cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll
    • Gracias – no es posible conocer la «_D»s que Windows espera, sin el uso de MSVC para crear un proyecto.
    • En mi humilde opinión, _USRDLL y _WINDLL no debe necesite, simplemente, utilizar /LD sin pasar /DLL, /OUT para el enlazador por /link.
    • felicitaciones ir a @nn0p – de que usted haya encontrado la real documentado cambiar a hacer a-DLL compilación con cl; el original de la «solución» por Ebow Halm parece un crudo hack en comparación de la OMI.
  2. 3

    Resulta ocurre de forma automática.

    Si ha exportado funciones (por ejemplo, /exportación, __declspec(dllexport), etc) el vinculador generará automáticamente el .archivo lib (que, por supuesto, la necesidad o la dll en el vinculador de la línea de comandos).

    • de hecho, es mejor utilizar un módulo de archivo de definiciones, debido a que permite el uso de prototipos sin __declspec(dllexport), que a su vez permite que usted utilice la original en el archivo de encabezado del archivo dll estás enganchando
  3. 3

    Similares a Ebow Halm la respuesta, pero el uso de una .archivo def para la inclusión de las funciones exportadas y los nuevos argumentos de línea de comandos:

    "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:

  4. 1

    Hace cl necesita de argumentos, para indicar que es la compilación de un archivo DLL? (Sé que el archivo DLL se exportan prototipos necesidad __declspec(dllexport)).

    No desde Win3x se fue, ahora sólo necesitan __declspec(dllexport) o un .DEF archivo que define los nombres de los símbolos que desea exportar. una .archivo def permite exportar los símbolos con otros nombres, por lo que todavía puede ser útil para los casos especiales.

    Sé enlace necesidades /dll como un argumento.

    Sí.

    Voy a ejecutar lib y enlace, para producir el .lib y .dll respectivamente, o se enlace producir tanto?

    lib sólo se utiliza para crear las bibliotecas estáticas (o agregar .objs a su implib)
    Enlace producirá una .dll y una importación .lib para ello.

  5. 0

    La forma más fácil de averiguarlo es hacer un proyecto MSVC donde se establece todo lo que usted desea, a continuación, habilitar la generación de registro, hacer un construir y analizar el buildlog para todos los comandos y sus argumentos.

    • Sí. Sin embargo, esto implicará la instalación de la MSVC GUI -, que tendrá una no despreciable período de tiempo y, sin duda, devestate mi actual sistema de configuración de compilación; y todos los que, simplemente, para crear un único proyecto, así que puede examinar los archivos de proyecto.
    • Cierto, pero usted no puede conseguir más precisos que los que. Si utiliza una máquina virtual que no devestate nada, pero sí, que toma aún más tiempo. 🙂 Saludos, Sebastiaan

Dejar respuesta

Please enter your comment!
Please enter your name here