2009-08-14 25 views
8

Utilizando Visual Studio 2008 y su compilador de C/C++, cómo creo una DLL de Win32 que solo depende de otras DLL de Windows y no tiene dependencia del Microsoft C runtime?Cómo creo una DLL de Win32 sin una dependencia en el tiempo de ejecución de C

Tengo un código C que quiero colocar en una DLL que es completamente computación y casi no hace uso de las funciones de la biblioteca C.

Para aquellos que sí utiliza (por ejemplo, memcpy), me complace volver a trabajar el código para utilizar los equivalentes de API Win32 (por ejemplo, CopyMemory).

+0

CopyMemory no es una función de winapi, tendrá que escribir su propio – Anders

+6

Lo siento para encontrar un hilo viejo, pero 'CopyMemory' es una función de API: http://msdn.microsoft.com/en-us/library/ aa366535% 28VS.85% 29.aspx Excepto que es '# define'd para llamar a' memcpy' en su lugar. – Thomas

Respuesta

10

Utilice la opción del vinculador/NODEFAULTLIB y (por supuesto) asegúrese de no tener dependencias reales en el tiempo de ejecución. También deberá especificar & para definir su propio punto de entrada para el DLL usando la opción del enlazador/ENTRY o alternativamente tener su propia función de punto de entrada que coincida con el nombre esperado por el compilador/enlazador (para un dll, eso es _DllMainCRTStartup).

artículo de Matt Pietrek de camino de regreso cuando el LIBCTINY probablemente tendrá toda la información que necesita:

+0

Para citar de ese artículo "Afortunadamente, hemos pasado de esos días, y en la mayoría de los casos puede confiar en que MSVCRT.DLL esté disponible en sus máquinas de destino". Y Pietrek sugiere que tú debes depender tanto. –

+0

¿Y esto * sigue siendo cierto *? Los lotes han cambiado desde los días de Windows 2000. Creo que ahora no es el caso de que dependamos de MSVCRT en la máquina. Al menos es más complicado de lo que indica la declaración de Matt. – Cheeso

+2

Podemos confiar en que MSVCRT.dll esté en la máquina, pero los enlaces de Visual C++ en contra de MSVCRver.dll donde ver es 80, 90, 100, 110, etc. – BCran

0

Algunas bibliotecas de Windows dependen del tiempo de ejecución de C (ODBC32.DLL, por ejemplo) , así que creo que no puede ocultarse nada aquí. ¿Por qué querrías hacer esto, de todos modos?

+3

Creo que es justo suponer que las dependencias de windows dlls vendrán con windows. No veo tu punto. –

+0

Si su código depende de una DLL como ODBC32, entonces depende indirectamente del CRT, que viene con Windows: ¿tiene la impresión errónea de que debe distribuirse por separado? Y si votó negativamente esta respuesta, tengo que preguntar: ¿por qué? –

+0

Si construyo mi código con el compilador de Microsoft C, debo usar el tiempo de ejecución de C suministrado con él, si deseo el comportamiento que documentan/suport. Eso requiere la distribución de dicho tiempo de ejecución con mi código. Supongo que podría 'descubrir' otro tiempo de ejecución de C en Windows y de alguna manera vincularlo dinámicamente, pero eso es más trabajo de lo que tenía pensado, especialmente cuando en realidad no necesito ninguna de sus funciones ... –

0

Compilarlo con static microsoft lib.

+2

Como se discutió aquí: http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.80).aspx Un tiempo de ejecución de Microsoft microsoft C mejor no está vinculado estáticamente a un dll en un sistema donde otras bibliotecas puede estar usando el tiempo de ejecución C –

0

Habría que asegurarse de que ninguno de los archivos DLL de Win32 que utiliza necesidad el tiempo de ejecución de C también, o de lo contrario, vuelve al punto uno. Compilar su DLL de forma estática no tendrá importancia si una de las DLL de Win32 depende del tiempo de ejecución de C.

La única forma en que puedo ver que esto funciona es vincular estáticamente TODAS tus DLL dependientes (si es que eso es factible) a tu DLL. Esto, por supuesto, significa que tendría que volver a compilar para aprovechar las actualizaciones de DLL.

5

Puede tener más dependencias en el CRT de lo que cree. Destruye recursos como el almacenamiento local de subprocesos y el CRT ejecuta los inicializadores de clases globales antes de main().

Considere vincularse con un CRT estático, como alguien dijo, y si realmente no quiere, use/NODEFAULTLIB y/ENTRY como dijo otra persona.

Ah, y en lugar de volver a trabajar con memcpy, considere utilizar el compiler intrinsic superrápido para ello. Puede activar intrinsics con/Oi.

+0

Estoy utilizando memcpy como ejemplo solamente. –

+1

Como yo. Hay muchos intrínsecos del compilador. –

+0

Es una buena idea, pero ¿documentan que los intrínsecos del compilador no dependen de la existencia de su propio tiempo de ejecución de C? Supongo que podría examinar la salida del compilador para estar seguro, pero eso es más trabajo de lo que tenía en mente ... –

4

La bandera del enlazador /NODEFAULTLIB no es en realidad la bandera propia. Ignorará todas las bibliotecas predeterminadas, incluidas otras como uuid.lib.

Lo que desea es la opción del compilador /Zl, "omite el nombre predeterminado de la biblioteca en .OBJ".

4

para el modo "depuración" intente esto:

  1. Ir a Proyecto \ [Proyecto] Propiedades ...
  2. abierto Propiedades de configuración
  3. abierto C/C++
  4. abierto generación de código
  5. Para Runtime Library Seleccionar multi-hilo de depuración (/ MTD) en lugar de Multi- roscado Debug DLL (/ MDd)

para el modo "Liberar", realice los mismos pasos excepto que seleccionando Multiproceso (/ MT) en el último paso.

Esto hace que cualquier función C Runtime que se utiliza en su programa esté vinculada de forma estática a su archivo binario.

+0

Eso funcionó para mí. No quería eliminar la dependencia a MSVCRT, sino que de alguna manera "limitar" las dependencias adicionales que podrían haber causado el error de "falta de dependencia". – Matthieu

Cuestiones relacionadas