9

Tengo un programa C++ razonablemente grande (~ 11mb exe) compilado bajo VS2008 y estaba interesado en ver si la optimización del programa completo afectaría significativamente su rendimiento. Sin embargo, activar la optimización del programa completo y la generación de código de tiempo de enlace hace que el enlace falle de la siguiente manera;Error al optimizar todo el programa en VC2008

1>c:\cpp\Win32\Atlas\tin\TINDoc.Cpp : fatal error C1083: Cannot open compiler intermediate file: '.\releaseopt\TINDoc.obj': Not enough space 
1>LINK : fatal error LNK1257: code generation failed 

En cuanto a administrador de tareas, puedo ver el enlazador usando más y más memoria hasta que se agote y las bombas a cabo. El compilador se ejecuta en XP 32 bits con 2 GB o archivo de página RAM y 2 GB. ¿WPO está limitado a aplicaciones más pequeñas y/o entornos más grandes, o hay alguna manera de hacer que el enlazador sea un poco más frugal en el uso de la memoria.

n.b. ya se convirtió en encabezados precompilados, lo que causaba que la compilación fallara antes de vincular, y desactivaba el resultado de la información de depuración y cualquier otra cosa que pudiera requerir recursos adicionales. La ayuda para C1083 sugiere que faltan archivos de encabezado o manejadores de archivos inadecuados en lugar de falta de espacio.

Edit: Lo tengo trabajando bajo VS2010, aunque sin encabezados precompilados, pero las ganancias de rendimiento no son tan significativas. Dejaré esta opción en paz hasta que me mueva a una plataforma más robusta de 64 bits con una versión más robusta de VS2010.

+6

Pregunta interesante. ¿Qué hay del espacio libre en el disco? ¿quizás te estés quedando sin dinero? Encuentro [este error en Microsoft Connect] (http://connect.microsoft.com/VisualStudio/feedback/details/581207/visual-studio-2005-sp1-reproducible-linker-error-lkn1257-caused-by-c1083) eso parece coincidir con tus síntomas. Los comentarios dicen que se ha solucionado en VS 2010. Si se trata de una opción, podrías intentarlo. –

+1

Parece ser el mismo error. Intentaré con VS2010 cuando tenga oportunidad y publicaré mis resultados. Gracias por la respuesta. Por cierto, un montón de espacio en disco disponible. –

+2

VC2008 es una bestia frágil. El optimizador simplemente no funciona en algunos casos, y parece que tiene uno de esos casos. –

Respuesta

5

VC2008 es una bestia frágil. El optimizador simplemente no funciona en algunos casos, y parece que es posible que tenga uno de esos casos.

Los ejemplos de "no trabajar" incluyen

  • código optimizado-De (lento!)
  • compilador o (más frecuentemente) enlazador se bloquea
  • mensajes de error de compilación/enlace Obscure
  • código incorrecta ejecución (esta es rara, pero no desconocida).

En realidad, si nos fijamos en algunos de los trucos utilizados por los optimizadores modernos es bastante sorprendente que funcione tan a menudo como lo hace. La complejidad es bastante asombrosa.

Abordar el problema de Shane específicamente, algunas cosas que podrían causar que su error:

  1. quedando sin identificadores de archivo solía ser un gran problema en DOS y las primeras versiones de Windows. Casi nunca lo ves en las versiones modernas de Windows. Ni siquiera estoy seguro de que todavía haya un límite en los identificadores de archivos.

  2. Un error del compilador podría estar haciendo un ciclo infinito, lo que significa que no habrá suficiente cantidad de recursos.

  3. Un archivo de inclusión recursivo también podría causar algo similar. ¿Todos sus archivos incluidos tienen "#pragma once" o "#if !defined(FOO_INCLUDED)"?

  4. ¿Es posible que haya incluido el archivo TINDoc.obj dos veces en el proyecto?El compilador de 2008 es agresivamente de múltiples subprocesos y puede haber una disputa entre dos subprocesos que intentan acceder al archivo. En realidad, esto podría suceder a través de un error del compilador, incluso si no ha incluido el archivo dos veces.

  5. Si el programa realmente es demasiado grande, considere dividirlo en uno o más archivos DLL y la construcción de ésta poco a poco, o dividir el archivo de origen polémico en varios archivos a la compilación durante varias fases.

No asuma que, porque dice "no hay suficiente espacio", tiene que ser la razón. Algunos programas (incluidos algunos compiladores) adivinarán una razón para un error, en lugar de verificar.

Puede supervisar el uso de memoria, mangos, etc., utilizando el administrador de tareas o Monitor de rendimiento, o (mi preferencia) Process Explorer

ya publicado la primera parte de esto como un comentario (arriba) pero una convirtiéndolo en una respuesta, como lo sugirió Ben (http://stackoverflow.com/users/587803/ben), y lo amplió un poco.

+0

Buena sinopsis Michael, utilizo '#pragma una vez' en todos los encabezados, y estaba viendo un gráfico de recursos para que el error de espacio parezca razonable. Es una gran base de código que genera ~ 11mb de un exe, con un buen número de DLL de terceros. Hice funcionar la optimización de todo el programa utilizando VS2010, y no produce muchas mejoras en mi caso, por lo que voy a evitar esta opción por el momento. –

3

Puede intentar iniciar XP con el modificador /3G para darle al enlazador un espacio de direcciones de 3GB. En Vista/7, use BCDEDIT /Set IncreaseUserVa 3072 en la línea de comando para obtener el mismo efecto.

Esto ha solucionado problemas al crear .ilk-files para mí.

Cuestiones relacionadas