Error irrecuperable del enlazador: LNK1102: memoria insuficiente
Este artículo le ayuda a resolver un error de memoria insuficiente que se produce al compilar proyectos grandes mediante conjuntos de herramientas x86 (32 bits).
Versión original del producto: Visual Studio Professional 2010
Número de KB original: 2891057
Síntomas
Supongamos que compila proyectos grandes mediante conjuntos de herramientas x86 (32 bits) (optimización de programa completa habilitada). Esto implica la generación de código en tiempo de vínculo (LTCG).
En este escenario, el enlazador puede notificar problemas de memoria insuficiente (OOM) que dan lugar a errores de compilación.
Causa
Este problema se produce principalmente debido a la gran cantidad de espacio de montón que requiere el compilador durante LTCG. Por lo general, el enlazador está enlazado a entrada y salida de disco (E/S) y no usa tanta memoria como el compilador. Sin embargo, el enlazador invoca al compilador durante LTCG.
El enlazador y el compilador tienen su propio esquema de administración de montón. No tienen un mecanismo para comunicarse entre sí para ayudar cuando se cumple la presión del espacio de direcciones. Además, debido al uso intensivo y frecuente de la memoria de pico en el compilador, puede haber una fragmentación grave en el espacio de direcciones que da lugar a un error cuando se solicita una pequeña cantidad de espacio de montón.
Solución
En Microsoft Visual Studio 2013, se introdujo un mecanismo para asegurarse de que cuando la asignación del montón no se realiza correctamente, el compilador lo comunicará al enlazador y el enlazador liberará espacio en el montón mediante la liberación de un archivo asignado. También hemos implementado un mecanismo para asegurarse de que cuando aumenta la presión de memoria, el compilador aumentará el tamaño de página en la asignación del montón para ayudar con el problema de fragmentación. Sin embargo, se recomienda aprovechar el conjunto de herramientas de compilador cruzado x64 (64 bits) si se aproxima a los límites de espacio de direcciones de 32 bits.
En Visual Studio 2013, también hemos introducido la herramienta cruzada x64. Incluye compiladores o enlazadores cruzados de 64 bits para compilar para plataformas x86 y arm. También es para el conjunto de herramientas cruzadas x86 (32 bits) que está disponible en Visual Studio 2012 y versiones anteriores. Este artículo contiene información general sobre cómo los usuarios usan el conjunto de herramientas cruzadas x64 (64 bits). Si no puede pasar a Visual Studio 2013, puede usar las siguientes soluciones alternativas con Visual Studio 2012 y versiones anteriores:
- Si la aplicación está destinada a la plataforma x64, use el conjunto de herramientas x64 para compilar la aplicación. Puede encontrar instrucciones sobre Cómo: Habilitar un conjunto de herramientas de MSVC hospedado de 64 bits y x64 en la línea de comandos.
- Si actualmente está compilando la aplicación en un sistema operativo x86, vaya a un sistema operativo x64. Lo que eleva el espacio de direcciones virtuales disponible de 2 gigabytes (GB) a 4 GB.
- Si actualmente está compilando en un sistema operativo x86 y no puede moverse a un sistema operativo x64, use el modificador de inicio /3GB. Esto eleva el espacio de direcciones virtuales disponible a 3 GB.
Más información
Puede encontrar los dos conjuntos de herramientas cruzadas basados en x64 en el directorio "%Install Path%\Microsoft Visual Studio 12.0\VC\bin", como se muestra en la ilustración siguiente.
Las carpetas amd64_x86 y amd64_arm contienen todo lo que debe tener para compilar para los destinos x86 y arm mediante conjuntos de herramientas cruzadas x64.
Para MSBuild usuarios
Si actualmente usa MSBuild como parte del proceso de compilación, puede aprovechar una nueva propiedad de nivel de proyecto denominada PreferredToolArchitecture. Esta propiedad permite a los usuarios seleccionar qué conjunto de herramientas (x86 o x64) usar para compilar una aplicación.
Cuando se usa /p:PreferredToolArchitecture=x64 argument junto con el msbuild comando , el conjunto de herramientas nativas x64 (VC\bin\amd64) se usa al compilar aplicaciones que tienen como destino la plataforma x64 y el conjunto de herramientas cruzadas x64 (VC\bin\amd64_x86) se usa al compilar aplicaciones destinadas a la plataforma x86.
Para Visual Studio usuarios del IDE
Las herramientas cruzadas x64 no se admiten de forma inmediata en el entorno de desarrollo integrado (IDE) de Visual Studio. Lo abordaremos en el futuro. Sin embargo, la siguiente solución alternativa debe permitirle aprovechar las ventajas de las herramientas cruzadas x64 en el IDE de Visual Studio:
Inicie el símbolo del sistema Visual Studio 2013 desarrollador. Puede encontrar el símbolo del sistema para desarrolladores en la pantalla de inicio de Windows, como se muestra aquí.
En el símbolo del sistema para desarrolladores, establezca la
PreferredToolArchitecturepropiedad para que apunte al conjunto de herramientas que desea usar para compilar las aplicaciones de destino.Inicie Visual Studio (
devenv) desde el símbolo del sistema para desarrolladores. Ahora debería estar listo para aprovechar las ventajas de las herramientas cruzadas.
Una manera rápida de comprobar que se usa el conjunto de herramientas correcto es crear y compilar una aplicación que tenga la marca
/Btde compilador adicional . La/Btmarca del compilador muestra información detallada sobre el tiempo dedicado a los archivos DLL C1, C1XX y C2. Además, proporciona detalles sobre qué conjunto de herramientas se usa para compilar las aplicaciones de destino. La/Btmarca se puede aplicar en las páginas de propiedades del proyecto (Propiedades > de **configuraciónC++**Línea de comandos > ). En la ilustración siguiente, observe el conjunto de herramientas que se usa (amd64_x86).