Schwerwiegender Linker-Fehler: LNK1102: Nicht genügend Arbeitsspeicher
Dieser Artikel hilft Ihnen bei der Behebung eines Speicherfehlers, der beim Erstellen großer Projekte mithilfe von x86-Toolsätzen (32-Bit) ausgelöst wird.
Originalversion des Produkts: Visual Studio Professional 2010
Ursprüngliche KB-Nummer: 2891057
Problembeschreibung
Gehen Sie davon aus, dass Sie große Projekte mithilfe von x86-Toolsätzen (32-Bit) erstellen (Die Optimierung des gesamten Programms ist aktiviert). Dies impliziert die Linkzeit-Codegenerierung (LTCG).
In diesem Szenario meldet der Linker möglicherweise Probleme mit nicht genügend Arbeitsspeicher (OOM), die zu einem Buildfehler führen.
Ursache
Dieses Problem tritt hauptsächlich aufgrund des großen Heap-Speicherplatzes auf, der vom Compiler während des LTCG-Vorgangs benötigt wird. Im Allgemeinen ist der Linker an die Datenträgereingabe/-ausgabe (E/A) gebunden und verwendet nicht so viel Arbeitsspeicher wie der Compiler. Der Linker ruft den Compiler jedoch während LTCG auf.
Der Linker und der Compiler verfügen jeweils über ein eigenes Heapverwaltungsschema. Sie haben keinen Mechanismus, um miteinander zu kommunizieren, um zu helfen, wenn der Adressraumdruck erreicht wird. Darüber hinaus kann es aufgrund der hohen und häufigen Spitzenauslastung des Arbeitsspeichers im Compiler zu einer starken Fragmentierung des Adressraums kommen, die zu einem Fehler führt, wenn ein geringer Heap-Speicherplatz angefordert wird.
Lösung
In Microsoft Visual Studio 2013 haben wir einen Mechanismus eingeführt, mit dem sichergestellt werden kann, dass die Heap-Zuweisung nicht erfolgreich ist, der Compiler sie an den Linker weitergibt, und der Linker gibt heap-Speicherplatz frei, indem er eine zugeordnete Datei freigibt. Wir haben auch einen Mechanismus implementiert, um sicherzustellen, dass der Compiler bei steigendem Speicherdruck die Seitengröße bei der Heapzuordnung erhöht, um das Fragmentierungsproblem zu beheben. Es wird jedoch empfohlen, den x64-Compilertoolsatz (64-Bit) zu nutzen, wenn Sie sich den 32-Bit-Adressraumbeschränkungen nähern.
In Visual Studio 2013 haben wir auch das x64-Kreuztool eingeführt. Es enthält 64-Bit-Crosscompiler/Linker zum Erstellen für x86- und Arm-Plattformen. Dies gilt auch für den x86-Toolsatz (32-Bit), der in Visual Studio 2012 und früheren Versionen verfügbar ist. Dieser Artikel enthält eine Übersicht darüber, wie Benutzer den x64-Toolsatz (64-Bit) verwenden. Wenn Sie nicht zu Visual Studio 2013 wechseln können, können Sie die folgenden Problemumgehungen für Visual Studio 2012 und frühere Versionen verwenden:
- Wenn Ihre Anwendung auf die x64-Plattform ausgerichtet ist, verwenden Sie das x64-Toolset, um Ihre Anwendung zu erstellen. Anweisungen finden Sie unter "How to: Enable a 64-Bit, x64 hosted MSVC toolset" in der Befehlszeile.
- Wenn Sie Ihre Anwendung derzeit unter einem x86-Betriebssystem erstellen, wechseln Sie zu einem x64-Betriebssystem. Dadurch wird der verfügbare virtuelle Adressraum von 2 Gigabyte (GB) auf 4 GB erhöht.
- Wenn Sie derzeit ein x86-Betriebssystem kompilieren und nicht zu einem x64-Betriebssystem wechseln können, verwenden Sie den /3GB-Startschalter. Dadurch wird der verfügbare virtuelle Adressraum auf 3 GB erhöht.
Weitere Informationen
Die beiden x64-basierten Kreuztoolsätze finden Sie im Verzeichnis "%Installationspfad%\Microsoft Visual Studio 12.0\VC\bin", wie in der folgenden Abbildung dargestellt.
Die Ordner amd64_x86 und amd64_arm enthalten alles, was Sie für x86- und Armziele mit x64-Kreuz-Toolsätzen erstellen müssen.
Für MSBuild Benutzer
Wenn Sie derzeit MSBuild als Teil Ihres Buildprozesses verwenden, können Sie eine neue Eigenschaft auf Projektebene nutzen, die aufgerufen PreferredToolArchitecturewird. Mit dieser Eigenschaft können Benutzer auswählen, welches Toolset (x86 oder x64) zum Erstellen einer Anwendung verwendet werden soll.
Wenn Sie den /p:PreferredToolArchitecture=x64 argument Befehl zusammen verwenden msbuild , wird der systemeigene x64-Toolsatz (VC\bin\amd64) verwendet, wenn Sie Anwendungen für die x64-Plattform erstellen, und der x64-Toolsatz (VC\bin\amd64_x86) wird verwendet, wenn Sie Anwendungen erstellen, die auf die x86-Plattform abzielen.
Für Visual Studio IDE-Benutzer
Die x64-Kreuztools werden in der Visual Studio Integrated Development Environment (IDE) nicht standardmäßig unterstützt. Wir werden uns in Zukunft damit befassen. Die folgende Problemumgehung sollte es Ihnen jedoch ermöglichen, die x64-Kreuztools in der Visual Studio IDE zu nutzen:
Starten Sie die Eingabeaufforderung für Visual Studio 2013-Entwickler. Sie finden die Eingabeaufforderung für Entwickler auf der Windows Startbildschirm, wie hier gezeigt.
Legen Sie an der Eingabeaufforderung für Entwickler die
PreferredToolArchitectureEigenschaft so fest, dass sie auf den Toolsatz verweist, den Sie zum Erstellen Ihrer Zielanwendungen verwenden möchten.Starten Sie Visual Studio (
devenv) über die Eingabeaufforderung des Entwicklers. Sie sollten nun bereit sein, die Cross-Tools zu nutzen.
Eine schnelle Möglichkeit, um zu überprüfen, ob der richtige Toolsatz verwendet wird, besteht darin, eine Anwendung mit dem zusätzlichen Compilerkennzeichen
/Btzu erstellen und zu erstellen. Das/BtCompilerkennzeichen spuckt ausführliche Informationen über die Zeit aus, die in C1-, C1XX- und C2-DLLs verbracht wird. Darüber hinaus enthält es Details dazu, welcher Toolsatz zum Erstellen der Zielanwendungen verwendet wird. Das/BtFlag kann unter den Projekteigenschaftenseiten (KonfigurationseigenschaftenC > ++ > -Befehlszeile) angewendet werden. Beachten Sie in der folgenden Abbildung den verwendeten Toolsatz (amd64_x86).