2008-12-04 10 views

Respuesta

12

No estoy seguro acerca de las últimas versiones de VC++, pero anteriormente podía decirle al enlazador que vincule con una versión estática de la biblioteca de tiempo de ejecución de MSVCRT en lugar de la versión dinámica (DLL). Es posible que esta opción aún exista.

+0

Esta es una idea interesante. Parece que MS recomienda no hacerlo, pero si resuelve mis problemas ... –

+0

Esto funcionó como un campeón, gracias. –

+0

No estoy de acuerdo. Puede encontrar todo tipo de problemas cuando intenta vincular bibliotecas estáticas dentro de una biblioteca que es dinámica. –

1

Dale a esta herramienta una oportunidad: http://www.dependencywalker.com/. Le permitirá recorrer sus dependencias en un exe o dll determinado.

+0

Parece que crear una DLL vacía en VS2008 también tiene esta dependencia. No agregué ninguna referencia adicional ni nada, solo un proyecto vacío. –

7

De acuerdo con this MSDN page, las bibliotecas estáticas todavía están disponibles. Ir a propiedades del proyecto, propiedades de configuración, C/C++, generación de código, biblioteca de tiempo de ejecución.

Seleccione Depuración multiproceso para la configuración de depuración y Multiproceso para la configuración de lanzamiento. (No estoy seguro de si los nombres son todos iguales en VS2008, pero deberían estar "en algún lugar". Puede actualizarse mañana con diferencias específicas de VS2008)

Además, como se sugirió wbic16, use la función de dependencia para identificar otras dependencias estáticas.

3

Si está absolutamente seguro de que no tiene dependencias en el tiempo de ejecución de C, puede evitar vincularlo activando el indicador "Ignorar todas las bibliotecas predeterminadas" (/ NODEFAULTLIB) en el Enlazador -> Proyecto de entrada página de opciones. Es posible que también deba deshabilitar las comprobaciones básicas de tiempo de ejecución (establezca "Comprobaciones básicas de tiempo de ejecución" en Predeterminado en C/C++ -> Generación de código) y también puede tener que eliminar el punto de entrada (configure "Sin punto de entrada" en "Sí (//NOENTRY) "en Linker -> Advanced).

Ver también http://support.microsoft.com/kb/814472, tiene buena información sobre la creación de DLL para extensiones administradas para C++.

Editar: Observe que la ejecución sin tiempo de ejecución de C también significa que no tiene la función de asignación de memoria fácil como malloc() y nueva.

+0

Creo que NODEFAULTLIB solo debe utilizarse en esas circunstancias excepcionales en las que puede garantizar que NO se está utilizando la biblioteca estándar. De lo contrario, es mejor vincular el tiempo de ejecución como estático. –

1

Con un poco de trabajo, libCTiny todavía funciona como un reemplazo para la lib predeterminada. Este tipo de biblioteca hace/NODEFAULTLIB utilizable.

Para responder a su segunda pregunta, con el interruptor de enlace/VERBOSE el vinculador le dirá qué símbolos se toman de qué biblioteca.

0

Asegúrate de que cada cosa se publica con tanta frecuencia en depuración, el dll se vincula con dlls de depuración especiales que normalmente no se envían con Windows y provocará problemas de dependencia.

Cuestiones relacionadas