Behebung von 'fatal error: bytecode stream generated with LTO version ... instead of the expected ...'

English Deutsch

Problem:

Beim Kompilieren eines Programms oder einer Bibliothek mit GCC erhältst du eine Fehlermeldung ähnlich dieser:

gcc_lto_error.txt
fatal error: bytecode stream generated with LTO version 5.1 instead of the expected 5.2

Lösung

Dieser Fehler bedeutet im Wesentlichen, dass du einige binäre Buildergebnisse (meistens Objektdateien) hast, die mit anderen binären Buildergebnissen inkompatibel sind, aber du versuchst, sie zusammenzulinken. Der LTO-Teil bedeutet nur, dass die Inkompatibilität darauf zurückzuführen ist, dass du Link-Time Optimization aktiviert hast — aber du musst dir darüber keine Gedanken machen, du kannst es einfach wie jede andere Inkompatibilität behandeln.

In fast allen Fällen gibt es einen sehr einfachen Grund für den Fehler: Du hast dein Projekt mit einer älteren GCC-Version gebaut, dann GCC aktualisiert und (teilweise, da nicht alle Dateien geändert wurden) neu kompiliert. In diesem Fall gibt es eine einfache Lösung: Bereinige deinen Build und baue von Grund auf neu.

Wenn du make (oder CMake) verwendest, ist dies normalerweise so einfach wie

make_clean_rebuild.sh
make clean # Alte, inkompatible Dateien entfernen
make # Neu bauen

Für andere Build-Systeme, schlage nach, wie du deinen Build entsprechend bereinigst — oder lösche einfach dein build- oder dist-Verzeichnis, wenn das keine unbeabsichtigten Nebeneffekte verursacht.

In einigen sehr seltenen Fällen verursacht ein Problem in der Build-System-Konfiguration, dass die Software mit zwei verschiedenen Compilern gebaut wird. Wenn du denkst, dass das der Fall sein könnte (d.h. wenn der Bereinigungsprozess nicht hilft), schlage vor, die ausführliche Ausgabe deines Build-Systems zu betrachten — bedenke jedoch, dass es wahrscheinlicher ist, dass du versuchst, eine stray Objektdatei zu linken, die mit einer älteren Version des Compilers gebaut wurde.

Wenn du damit zufrieden bist, nur das Symptom zu beheben während du die Möglichkeit schwer zu debuggender Inkompatibilitäten ignorierst, kannst du einfach das -flto-Flag in der Build-System-Konfiguration weglassen. Dies versteckt die LTO-Inkompatibilität, da es den Link-Time-Optimizer komplett deaktiviert, aber auch wenn keine neuen Fehlercodes angezeigt werden, wird dieser Ansatz generell nicht empfohlen.


Check out similar posts by category: GCC Errors