Problembehandlung für den Microsoft Visual C++ Compiler oder den Visual C++-Linker

Dieser Artikel enthält Lösungen für die Problembehandlung für Visual C++-Compiler oder Visual C++-Linker.

Gilt für:   Microsoft Visual C++ 2010 Express, Visual Studio
Ursprüngliche KB-Nummer:   974229

Aktion

Bei der Untersuchung eines möglichen Problems mit dem Microsoft Visual C++ Compiler oder Linker ist es wichtig, so viele Informationen wie möglich über den Buildprozess und die verwendeten Optionen abzurufen. In diesem Artikel werden einige Tipps zur Problembehandlung erläutert, mit denen Sie Ihr Buildproblem beheben oder umfassende Informationen für Microsoft-Support erfassen können.

Lösung

  • Compilerprobleme

    Bei Compilerproblemen wie internen Compilerfehlern (d. h. C1001), Blockaden oder Abstürzen kann es hilfreich sein, die Ausgabe des C/C++-Präprozessors zu erfassen, um ein vereinfachtes reproduzierbares Problembeispiel bereitzustellen. In der Visual C++-IDE können Sie dazu die Eigenschaft " Vorverarbeitete Datei generieren " auf "Mit Zeilennummern (/P) oder ohne Zeilennummern (/EP /P)" festlegen. Diese Eigenschaft finden Sie auf den Projekteigenschaftenseiten unter Konfigurationseigenschaften, C/C++, Einstellungen für den Präprozessor.

    Diese Einstellung kann auf Projektebene über das Menü "Project" festgelegt werden. In diesem Fall werden Dateien für alle Quelldateien im Projekt generiert.i, oder sie kann für eine einzelne Datei festgelegt werden, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei klicken und das Kontextmenü "Eigenschaften" auswählen, um das Eigenschaftendialogfeld für die einzelne Datei anzuzeigen.

    Der Compilerschalter /P leitet CL.EXE an, um die Ausgabe des Präprozessors in eine Datei zu erfassen. Durch das Hinzufügen von /EP wird das Hinzufügen von Zeilennummerninformationen zur resultierenden Datei unterdrückt. /P ist ausreichend, aber /EP /P generiert eine kleinere Ausgabedatei. Die generierte Präprozessorausgabedatei hat denselben Namen wie die zu kompilierte Quelldatei, aber mit der Dateierweiterung a.i generiert file1.cpp beispielsweise eine Datei1.i-Präprozessorausgabedatei im selben Verzeichnis.

    Hinweis

    Die Kompilierung wird bei Verwendung dieses Schalters über die Präprozessorphase hinaus fortgesetzt, d. h., vom Compiler wird keine .OBJ Datei generiert, und möglicherweise wird ein Linkfehler angezeigt, der anzeigt, dass OBJ-Dateien nicht gefunden werden können.

    Sie können die Ausgabedatei des Präprozessors selbst außerhalb des Kontexts eines Visual Studio Projekts kompilieren. Die .i Datei enthält den gesamten Headerdateicode, makroersetzungs- und vorverarbeitete Compilerdirektivinformationen, die für die Kompilierung dieser bestimmten .C Datei oder .CPP Quelldatei erforderlich sind. Mit anderen Worten, es ist ein eigenständiges Modul, das in der Lage sein sollte, ein Kompilierungsproblem ohne Abhängigkeiten von anderen Dateien zu reproduzieren. Die resultierende Datei ist häufig groß und enthält eine große Menge an Leerzeichen.

  • Verknüpfungsprobleme

    Bei Linkerproblemen (LNKxxxx-Typfehler) können Sie den Befehlszeilenschalter "/LINKREPRO Linker" verwenden, um einen Testfall zu generieren, der nur Linkereingaben ohne Abhängigkeit von Quelldateien enthält. /LINKREPRO verwendet die folgende Syntax:

    /LINKREPRO:<path>

    '<path>' ist der vollständige Pfad zu einem leeren Ordner im lokalen Dateisystem. Dieser Ordner muss bereits vorhanden sein. Der Linker erstellt ihn nicht automatisch und generiert einen Fehler, wenn der Ordner nicht vorhanden ist.

    Diese Option wird nicht direkt im Projektsystem verfügbar gemacht. Um es einem Build hinzuzufügen, öffnen Sie das Menü "Projekteigenschaften" im Menü Project. Geben Sie in den Konfigurationseigenschaften linker, command line, in the Additional Options edit box, enter the /LINKREPRO:<path> switch (including the forward slash) and replacing path with the pre-existing local folder path. Zum Beispiel: /LINKREPRO:C:\TEMP\LINKREPRO\.

    Wenn dieses Bearbeitungsfeld bereits andere Linkeroptionen enthält, trennen Sie sie durch Kommas.

    Alternativ können Sie eine Umgebungsvariable LINK_REPRO verwenden. Wenn die LINK_REPRO Umgebungsvariable vorhanden ist, liest der Linker den Ausgabepfad aus der Umgebungsvariablen und generiert ein Linkrepro. Der Schalter /LINKREPRO ist bei Verwendung der Umgebungsvariablen LINK_REPRO nicht erforderlich. So verwenden Sie die Umgebungsvariable LINK_REPRO :

    1. Öffnen Sie eine Visual Studio Eingabeaufforderung. Dies wird unter dem Startmenü im Ordner Visual Studio unter dem Unterordner Visual Studio-Tools installiert.

    2. Erstellen Sie die LINK_REPRO Umgebungsvariable, die auf ein vorhandenes und leeres Verzeichnis verweist, z. B.: SET LINK_REPRO=C:\TEMP\LINKREPRO\.

    3. Führen Sie Visual Studio an derselben Eingabeaufforderung aus, damit eine Kopie der geänderten Umgebung freigegeben wird.

    4. Öffnen Sie das Projekt, und erstellen Sie das gesamte Projekt neu.

    Wenn LINK.EXE im Build aufgerufen wird, wird alles kopiert, was sie benötigt, um Ihr Projekt mit dem Linkrepro-Verzeichnis zu verknüpfen. Zu den kopierten Dateien gehören Ihre Objektdateien (. OBJ), erforderliche Bibliotheksdateien (. LIB), einschließlich Microsoft-Bibliotheken und einer Linker-Antwortdatei (LINK. RSP), sodass LINK nicht mehr von Ihrer Lösungsdatei abhängig ist.

    Um zu bestätigen, dass Sie über alle erforderlichen Dateien zum Reproduzieren des Linkproblems verfügen, können Sie LINK in dem von der LINK_REPRO-Umgebungsvariablen angegebenen Verzeichnis mithilfe der linker-Antwortdatei ausführen, die von linkrepro generiert wurde: LINK @link.rsp.

    Verwenden Sie dazu den folgenden Befehl, um dieses Feature bei Verwendung der Befehlszeilenumgebungsvariablen zu deaktivieren: SET LINK_REPRO=.

    Sie können diesen Prozess auch verwenden, um die Dateien zu überprüfen, die an der Erstellung einer Bibliothek beteiligt sind, wenn Sie LIB.EXE oder LINK /LIB verwenden.

Haftungsausschluss

Haftungsausschluss für schnelle Veröffentlichung

Schnelle Veröffentlichungsartikel bieten Informationen direkt innerhalb der Microsoft-Supportorganisation. Die hierin enthaltenen Informationen werden als Reaktion auf neue oder eindeutige Themen erstellt oder dienen als Ergänzung zu anderen Knowledge Base-Informationen.

Haftungsausschluss

Microsoft und/oder seine Lieferanten übernehmen keine Zusicherungen oder Gewährleistungen hinsichtlich der Eignung, Zuverlässigkeit oder Genauigkeit der Informationen, die in den dokumenten und verwandten Grafiken enthalten sind, die auf dieser Website veröffentlicht werden (die "Materialien") für irgendeinen Zweck. Die Materialien können technische Ungenauigkeiten oder Tippfehler enthalten und können jederzeit ohne vorherige Ankündigung überarbeitet werden.

Im durch das anwendbare Recht maximal zulässigen Umfang verweigern und schließen Microsoft und/oder seine Lieferanten alle Zusicherungen, Gewährleistungen und Bedingungen aus, sei es ausdrücklich, konkludent oder gesetzlich, einschließlich, aber nicht beschränkt auf Zusicherungen, Garantien oder Bedingungen des Titels, Nichtverletzung, zufriedenstellende Bedingungen oder Qualität, Handelsüblichkeit und Eignung für einen bestimmten Zweck in Bezug auf die Materialien.