Fatal error when try to compile sketch

I downgraded the AVR versionfrom 1.63 to 1.61 because 1 sketch wouldn’t compile after I upgtraded to 1.63, so I went back to an older version.

Now when I try to compile

lto1: fatal error: bytecode stream generated with LTO version 3.0 instead of the expected 4.1
compilation terminated.
lto-wrapper: fatal error: /opt/arduino-1.8.8/hardware/tools/avr/bin/avr-gcc returned 1 exit status
compilation terminated.
/opt/arduino-1.8.8/hardware/tools/avr/bin/…/lib/gcc/avr/5.4.0/…/…/…/…/avr/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status

Thhe sketch is the Parola scrolling sketch from their examples.

// Use the Parola library to scroll text on the display
// Demonstrates the use of the scrolling function to display text received
// from the serial interface
// User can enter text on the serial monitor and this will display as a
// scrolling message on the display.
// Speed for the display is controlled by a pot on SPEED_IN analog in.
// Scrolling direction is controlled by a switch on DIRECTION_SET digital in.
// Invert ON/OFF is set by a switch on INVERT_SET digital in.
// UISwitch library can be found at https://github.com/MajicDesigns/MD_UISwitch
// MD_MAX72XX library can be found at https://github.com/MajicDesigns/MD_MAX72XX

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// set to 1 if we are implementing the user interface pot, switch, etc
#define USE_UI_CONTROL 0

#include <MD_UISwitch.h>

// Turn on debug statements to the serial output
#define DEBUG 0

#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define MAX_DEVICES 8
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10


// Scrolling parameters
const uint8_t SPEED_IN = A5;
const uint8_t DIRECTION_SET = 8;  // change the effect
const uint8_t INVERT_SET = 9;     // change the invert

const uint8_t SPEED_DEADBAND = 5;
#endif // USE_UI_CONTROL

uint8_t scrollSpeed = 25;    // default frame delay value
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // in milliseconds

// Global message buffers shared by Serial and Scrolling functions
#define	BUF_SIZE	75
char curMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "May all your dreams come true xx" };
bool newMessageAvailable = true;


MD_UISwitch_Digital uiDirection(DIRECTION_SET);
MD_UISwitch_Digital uiInvert(INVERT_SET);

void doUI(void)
  // set the speed if it has changed
    int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150);

    if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
      (speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
      scrollSpeed = speed;
      PRINT("\nChanged speed to ", P.getSpeed());

  if (uiDirection.read() == MD_UISwitch::KEY_PRESS) // SCROLL DIRECTION
    PRINTS("\nChanging scroll direction");
    scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
    P.setTextEffect(scrollEffect, scrollEffect);

  if (uiInvert.read() == MD_UISwitch::KEY_PRESS)  // INVERT MODE
    PRINTS("\nChanging invert mode");
#endif // USE_UI_CONTROL

void readSerial(void)
  static char *cp = newMessage;

  while (Serial.available())
    *cp = (char)Serial.read();
    if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE-2)) // end of message character or full buffer
      *cp = '\0'; // end the string
      // restart the index for next filling spree and flag we have a message waiting
      cp = newMessage;
      newMessageAvailable = true;
    else  // move char pointer to next position

void setup()
  Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline");

  pinMode(SPEED_IN, INPUT);

#endif // USE_UI_CONTROL

  P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);

void loop()
#endif // USE_UI_CONTROL

  if (P.displayAnimate())
    if (newMessageAvailable)
      strcpy(curMessage, newMessage);
      newMessageAvailable = false;

This is odd because if you have Arduino AVR Boards 1.6.21 installed, it should be using avr-gcc 4.9.2-atmel3.5.4-arduino2, but the error shows that avr-gcc 5.4.0 is being used instead.

Please do this:

  • (In the Arduino IDE) click File > Preferences
  • Check the box next to "Show verbose output during: > compilation
  • Click “OK”
  • Sketch > Verify/Compile
  • After the compilation fails you’ll see a button on the right side of the orange bar “Copy error messages”. Click that button.
  • In a forum reply here, click on the reply field.
  • Click the </> button on the forum toolbar. This will add the forum’s code tags markup to your reply.
  • Press “Ctrl + V”. This will paste the compilation output between the code tags.
  • Move the cursor outside of the code tags before you add any additional text to your reply.

If the length of the output exceeds the forum’s 9000 character limit, save it in a .txt file and post it here as an attachment. If you click the “Reply” button you’ll see the “Attachments and other options” link.

Hopefully the verbose output might provide some clues as to what is going on.

Thanks for the reply, and the said sketch is compuiling ok now.

I closed down the Arduino IDE, and restarted my linux machine, then tried to compile the same sketch , and this time it compiled without any errors.

I wonder if it was caused by the compilation cache not being cleared? I'm a bit skeptical about that because of the paths shown in the error message.

OK, well at least it's working. If the error returns, we can investigate it further.