Разбор ошибок · статья
Ошибки компиляции Arduino
«expected ';'», «was not declared in this scope», «No such file or directory» — что означают самые частые ошибки, почему компилятор показывает не ту строку и как быстро всё исправить.
Как читать ошибки
Сообщения печатает компилятор C++, и он пишет по-английски. Trema IDE переводит суть: над консолью появляется русская карточка — что случилось, в каком файле и в какой строке. Клик по карточке приводит к месту проблемы.

Главное правило: читайте первую ошибку в списке. Одна опечатка часто рождает лавину сообщений — исправьте первую причину, и остальные исчезнут сами.
Навигатор: нашли фразу — идите в раздел
Сообщений компилятора сотни, но в школьной и кружковой практике встречается десяток. Найдите свою строку и нажмите на неё — откроется нужный раздел этой страницы.
| Фраза в консоли | Что это |
|---|---|
expected ';' before | Пропущена точка с запятой — в строке выше указанной |
was not declared in this scope | Имя незнакомо компилятору: опечатка, не та библиотека или переменная объявлена не там |
No such file or directory | Не найдена библиотека из #include — её надо установить |
expected '}' at end of input | Не закрыта фигурная скобка |
no matching function for call to 'LiquidCrystal_I2C::begin()' | Скетч написан под другую одноимённую библиотеку экрана: у ходовой версии запуск — init(), разбор в статье про LCD 1602 |
redefinition of 'void setup()' | Две функции с одним именем — обычно два скетча в одной папке |
Скетч слишком большой | Программа не помещается во флеш-память платы |
секция текста превышает доступное пространство | То же самое, только это итоговая строка сборки |
does not name a type | Опечатка в типе, забытое void перед функцией или библиотека подключена ниже |
In file included from, compilation terminated | Поломка внутри подключённой библиотеки, а не в вашем файле |
warning: | Не ошибка: предупреждение, сборку не останавливает |
Compilation error: exit status 1 | Итоговая строка компилятора — причина написана выше |
undefined reference to `loop' | В скетче нет обязательной функции loop() или setup() — ошибка показывает файл ядра |
main file missing from sketch | Имя файла .ino не совпало с именем папки — среда не смогла открыть скетч |
Недостаточно памяти | Предупреждение, а не ошибка: глобальные переменные заняли больше 75 % ОЗУ |
Low memory available | То же предупреждение в англоязычной среде |
exit status 2 | Код возврата инструмента сборки, а не номер ошибки — причина выше по консоли |
Failed uploading, avrdude, not in sync | Это уже не компиляция, а загрузка в плату |
Ошибки вокруг экранов разобраны отдельно: LCD 1602 по I2C (одноимённые библиотеки, begin() против init(), #error из русской библиотеки) и OLED SSD1306 («allocation failed» при зелёной сборке). Про цветные экраны — TFT-дисплеи (Adafruit_GFX.h без BusIO, begin() вместо initR(), TFT_eSPI на 107 % флеша).
Что ломается чаще всего
За месяц наблюдений (24 июля — 21 августа 2026) мы собрали обезличенную статистику ошибок сборки — несколько тысяч сообщений. Картина получилась неожиданная: ненайденная библиотека встречается чаще, чем все настоящие ошибки в коде вместе взятые — 38 % против 28 %.
| Сообщение | Доля всех отчётов | Что это на самом деле |
|---|---|---|
No such file or directory | 38 % | Не установлена библиотека из строки #include — самая частая беда, и она не про код |
was not declared in this scope | 12 % | Опечатка в имени, переменная объявлена не там или библиотека подключена ниже |
expected ';' before … | 9 % | Потерян знак препинания — ищите строкой выше указанной |
avrdude: not in sync | 5 % | Это уже не компиляция: плата не отвечает при загрузке |
does not name a type | 3,5 % | Опечатка в типе, забытое void перед функцией или не подключённая библиотека |
redefinition, undefined reference | 1,6 % | Две одинаковые функции или, наоборот, пропала обязательная setup/loop |
всё остальное | 31 % | Длинный хвост редких сообщений: ядра плат, отдельные библиотеки, сбои инструментов |
Главный вывод для новичка: самая частая строка в отчётах — не опечатка, а ненайденная библиотека, 38 % всех случаев. Поэтому разбор стоит начинать со строки #include, а не с поиска опечаток в своём коде.
'x' does not name a type
Пятая по частоте ошибка и при этом самая «немая»: компилятор говорит, что слово в начале строки для него не тип данных. Причин у неё три:
- Опечатка в типе. Живые примеры:
vold setup()вместоvoid,liquidCristalвместоLiquidCrystal. Компилятор часто сам предлагает правильное слово — читайте хвост сообщенияdid you mean. - Сломана строка выше. Компилятор читает текст подряд: если в предыдущей строке потерялась точка с запятой или закрывающая скобка, «не типом» окажется первое слово следующей строки — хоть
void, хоть имя вашей функции. Смотрите на строку выше указанной. - Тип из библиотеки, которая не подключена. Объявление
Wire,TFT_ILI9341илиBluetoothSerialстоит выше строки#include— или библиотека не установлена вовсе. Подключение всегда идёт первым.
А вот забытая точка с запятой после описания класса или структуры даёт другое сообщение, и оно понятнее: expected ';' after struct definition. Номер строки при этом указывает на закрывающую фигурную скобку.
И отдельно про частый совет из интернета: строка setup() { без слова void даёт вовсе не это сообщение, а expected constructor, destructor, or type conversion и следом ambiguating new declaration of 'int setup()'. Лечится одинаково — вернуть void на место.
Compilation error: exit status 1
Эта строка стоит в самом конце и не объясняет ничего: так среда сообщает, что инструмент сборки завершился неудачей. Ноль — успех, любое другое число — нет, и какое именно, роли не играет: встречается и exit status 2. Причина всегда выше, в первой строке со словом error:. Пролистайте консоль вверх.
В разных средах строка выглядит по-разному: Arduino IDE пишет Compilation error: exit status 1, а Trema IDE и командная строка — Ошибка во время сборки: exit status 1. Смысл один и тот же. Отдельный случай — когда программа не влезает во флеш-память: тогда в конце стоит секция текста превышает доступное пространство на плате, и это уже вопрос размера, а не синтаксиса.
Важно не перепутать её с загрузкой. «Ошибка компиляции» (в английской среде Compilation error) — программа не собралась, плату можно даже не подключать. «Не удалась загрузка» (Failed uploading) — код в порядке, а прошивка не доехала до платы: это порт, кабель, драйвер или модель платы, и разбор для этого случая отдельный — ошибка при загрузке скетча.
expected ';' before …
Потеряна точка с запятой. Каждая команда в C++ должна заканчиваться символом ;. Хитрость в том, что компилятор замечает пропажу только на следующей команде — поэтому смотрите не только на указанную строку, но и на строку выше неё.
'x' was not declared in this scope
«Имя x не объявлено». Компилятор встретил слово, которого не знает. Причины по частоте:
- Опечатка. C++ различает большие и маленькие буквы:
digitalwrite— это неdigitalWrite. - Переменная не объявлена. Прежде чем пользоваться переменной, её нужно завести:
int ledPin = 13; - Забыт #include. Команды из библиотеки работают только после её подключения в начале скетча.
- Код переехал из .ino в свой файл .cpp. В файле
.inoсреда сама дописывает объявления всех функций, поэтому функцию можно вызывать выше её описания. В собственном.cppэтого не происходит: там нужен прототип, а ещё строка#include <Arduino.h>— без неё «не объявлены» окажутся дажеpinModeиdigitalWrite.
No such file or directory
Компилятор не нашёл файл из строки #include — то есть библиотека не установлена или имя написано с ошибкой. Trema IDE в этом случае сама предлагает установить недостающую библиотеку из каталога:

expected '}' at end of input
Не закрыта фигурная скобка. Каждой открывающей { нужна закрывающая }. Поставьте курсор на скобку — редактор подсветит её пару; так легко найти, какая осталась одинокой.
redefinition of 'void setup()'
В программе две функции setup() (или две loop()). Так бывает, когда пример вставили целиком в конец существующего скетча. В программе должна остаться ровно одна setup() и одна loop() — перенесите нужные команды внутрь существующих функций.
Скетч слишком большой: программа не помещается в память
Код написан правильно, но прошивка не влезает в плату: у Arduino Uno всего 32 КБ под программу и 2 КБ оперативной памяти. Trema IDE показывает карточку «Программа не помещается в память платы»; что именно занимает байты, что значат строки «Скетч использует … байт» и «Глобальные переменные используют … байт» и как освободить память — в отдельной статье «Память Arduino».
In file included from … / compilation terminated
Ошибка не в вашем файле, а внутри библиотеки, которую вы подключили. Цепочка In file included from — это след: кто кого подключил, пока компилятор не дошёл до места поломки. Читать её надо снизу вверх, но чинить обычно не код библиотеки.
- Чаще всего библиотека просто не подходит вашей плате: код для AVR не собирается под ESP32 и наоборот;
- бывает, что установлены две библиотеки с одинаковыми именами файлов — уберите лишнюю;
- строка
compilation terminatedозначает, что компилятор сдался и остановился: причина — в сообщении прямо над ней, а не в ней самой.
Если цепочка ведёт не в библиотеку, а в ваш собственный файл — дело в том, как проект разложен по файлам. Разбор таких сообщений — multiple definition, undefined reference, redefinition — с причинами и лечением собран в статье «#include и свои файлы .h и .cpp».
warning: — это не ошибка
Строки со словом warning сборку не останавливают: компилятор просто предупреждает, что место подозрительное. Скетч при этом собирается и заливается. Если сборка упала, ищите строку со словом error — предупреждения к делу не относятся.
Ошибка компиляции для платы Arduino Uno
Формулировка сбивает с толку: кажется, что виновата плата. На деле это просто заголовок — среда сообщает, для какой платы собирала. Само сообщение об ошибке идёт выше. Но одна связь с платой всё же есть: если скетч собирался для одной платы и перестал для другой, значит, в коде или библиотеке есть кусок, который живёт только на первой.
undefined reference to `loop' — исчезла обязательная функция
Эта ошибка приходит не от компилятора, а от компоновщика, и показывает чужой файл — поэтому пугает сильнее всего:
main.cpp:43: undefined reference to `setup'
main.cpp:46: undefined reference to `loop'
collect2.exe: error: ld returned 1 exit statusСтроки 43 и 46 — это места внутри ядра Arduino, где вызываются ваши функции. Значит, в скетче нет функции void loop() (или void setup()). Обе обязательны, пусть даже с пустым телом. Вторая частая причина — опечатка в подписи: void loop(int n) для компилятора это уже другая функция, поэтому нужной он не находит. Разбор с исходником ядра — в статье про setup() и loop().
В скетче отсутствует основной файл
Английская версия — main file missing from sketch. Это вообще не ошибка кода: среда не смогла открыть скетч, потому что имя главного файла .ino не совпадает с именем папки. Правило спецификации Arduino: папка moy_proekt должна содержать файл moy_proekt.ino.
Чаще всего так бывает, когда скачали один файл .ino из интернета и открыли прямо из «Загрузок». Лечение: создать папку с тем же именем, что у файла, и положить файл внутрь. Подробно про устройство скетча — на странице «Скетчи Arduino».
Недостаточно памяти, программа может работать нестабильно
Английский вариант — Low memory available, stability problems may occur. Это предупреждение, а не ошибка: скетч собрался, залить его можно. Среда сообщает, что глобальные переменные заняли слишком много оперативной памяти. Мы измерили порог: сообщение появляется, когда занято строго больше 75 % памяти. На Arduino Uno 1536 байт из 2048 (ровно 75 %) проходят молча, а с 1537 байт предупреждение уже печатается.
Игнорировать не стоит: оставшееся место нужно для локальных переменных и стека, и при нехватке плата начинает вести себя необъяснимо — перезагружаться, терять данные, зависать. Что делать — разобрано на странице «Память Arduino»: самый быстрый приём — обернуть текстовые строки в F(), это освобождает сотни байт.
Ошибка не в коде: сборка прошла, а загрузка — нет
Если сборка закончилась успешно, а дальше пишет об ошибке порта — это не ошибка компиляции, а связь с платой: не выбран или занят COM-порт, не установлен драйвер, кабель без данных. Полное дерево причин — на странице «Произошла ошибка при загрузке скетча», а как вернуть плату в список портов — в инструкции «Плата не видна: драйверы CH340 и CP2102».
Ошибка не в коде: среда не открылась или не скачала платы
Бывает и так, что до компиляции дело не доходит. Если Arduino IDE не запускается, висит на заставке или показывает белое окно — это разбор по симптомам на странице «Arduino IDE не запускается». Если же среда открылась, но менеджер плат и библиотек пуст, а в консоли мелькает «403 Forbidden» — вам сюда: разбор ошибки 403 и загрузки списков.
Ничего не помогло? Напишите в поддержку и приложите файл «Диагностика для поддержки» из программы — в нём журнал сборки, по которому мы быстро найдём причину.
Что значит exit status 1?
Это код возврата инструмента сборки, а не номер ошибки: ноль — успех, любое другое число — неудача, и какое именно, роли не играет. Настоящая причина написана выше по консоли, в первой строке со словом error:. В Arduino IDE та же строка выглядит как Compilation error: exit status 1, в Trema IDE — «Ошибка во время сборки: exit status 1».
Что значит «Ошибка компиляции для платы Arduino Uno»?
Это заголовок сообщения, а не причина: среда лишь называет плату, для которой собирала. Ищите первую строку со словом error: выше. Если же в скетче используются функции другой платы (например Serial1 или Keyboard), проверьте, что выбрана правильная плата — на Uno такого оборудования нет.
Что значит «Недостаточно памяти, программа может работать нестабильно»?
Это предупреждение, а не ошибка: скетч собрался и зальётся. Оно появляется, когда глобальные переменные заняли больше 75 % оперативной памяти платы — мы измерили порог. Оставшееся место нужно для локальных переменных, поэтому плата может начать перезагружаться. Самый быстрый приём экономии — макрос F() для текстовых строк.
Почему ошибки компилятора на английском?
Сырые сообщения печатает сам компилятор C++, он не знает русского. Поэтому Trema IDE показывает над консолью русскую карточку: что случилось, в какой строке и что сделать. Клик по карточке приводит к месту ошибки.
Ошибка указывает не на ту строку. Так бывает?
Да, это особенность C++: компилятор замечает проблему там, где код перестал складываться, а причина часто на строку-две выше — например, потерянная точка с запятой или незакрытая скобка.
Код верный, но загрузка в плату не идёт
Это уже не ошибка компиляции, а проблема связи с платой: проверьте, выбран ли правильный порт, не занят ли он другой программой (например, монитором порта в другом окне) и установлен ли драйвер USB-моста.
Куда написать, если ошибка непонятна?
Напишите в поддержку и приложите файл «Диагностика для поддержки» из программы — в нём журнал сборки. Так мы разберём ваш случай быстрее и заодно улучшим русские подсказки.
Пусть ошибки объясняются по-русски
В Trema IDE каждая ошибка сборки — с русским объяснением и ссылкой на строку. Дома — бесплатно: первую неделю без всего, дальше нужна только бесплатная регистрация. Все статьи — в базе знаний, раздел «Ошибки и решения».
