Сообщение «exit status 1 — ошибка компиляции для платы Arduino Nano» появляется в конце лога Arduino IDE и означает, что компилятор avr-gcc завершился с ошибкой: сама причина всегда находится выше, в строках лога, а «exit status 1» — лишь итоговый код завершения. Первое действие — прокрутить окно вывода вверх и найти строку со словом error:, именно она указывает файл, номер строки и суть проблемы.
Чаще всего сбой связан не с самой платой, а с кодом скетча, отсутствующими библиотеками или неверными настройками в меню «Инструменты». Ниже разберём все типовые причины и порядок их устранения — от простых проверок к более глубокой диагностике.
Как читать лог компиляции
Окно вывода внизу Arduino IDE по умолчанию показывает сокращённую информацию. Чтобы увидеть полный лог, откройте Файл → Настройки и включите галочки «Вывод компиляции» и «Показать подробный вывод». После этого при повторной компиляции вы получите детальный текст, где ошибка подсвечена оранжевым или красным.
Ищите строки вида sketch_name.ino:12:5: error: expected ';' before '...'. Формат расшифровывается так: имя файла, номер строки, позиция и описание. Не пытайтесь исправлять всё сразу — компилятор останавливается на первой серьёзной ошибке, и исправление её часто убирает и последующие сообщения.
Синтаксические ошибки в скетче
Самая частая причина — банальная опечатка в коде. Пропущенная точка с запятой, незакрытая скобка или неверное имя переменной мгновенно роняют компиляцию. Проверьте строку, указанную в логе, а также строку перед ней: компилятор часто сообщает об ошибке там, где она «проявилась», а не где допущена.
- 🔍 Пропущена точка с запятой
;в конце оператора - 🔍 Незакрытая фигурная
{}или круглая()скобка - 🔍 Переменная используется до объявления или с другим регистром букв
- 🔍 Функция вызвана с неверным числом аргументов
⚠️ Внимание: язык Wiring (C++) чувствителен к регистру. ИдентификаторыpinModeиPinMode— разные вещи, и вторая форма вызовет ошибку «was not declared in this scope».
Проблемы с библиотеками
Вторая по частоте группа ошибок — сообщения вида No such file or directory при подключении заголовочного файла, например #include <DHT.h>. Это значит, что нужная библиотека не установлена или установлена в неправильное место. Установка выполняется через Скетч → Подключить библиотеку → Управление библиотеками.
Бывает и обратная ситуация: установлено несколько библиотек с одинаковым именем заголовка, и компилятор берёт не ту. В логе тогда видно, какой именно файл был использован. Конфликт решается удалением лишней копии из папки Документы/Arduino/libraries.
Неверные настройки платы и процессора
Для Arduino Nano критично правильно выбрать не только плату, но и вариант процессора. В меню Инструменты → Плата должна стоять Arduino Nano, а в Инструменты → Процессор — вариант, соответствующий вашей плате: ATmega328P или ATmega328P (Old Bootloader). Неверный выбор процессора обычно ломает загрузку, а не компиляцию, но на старых версиях ядра может давать и ошибки сборки.
Если платы Nano нет в списке вообще — не установлен пакет поддержки AVR. Откройте Инструменты → Плата → Менеджер плат и установите Arduino AVR Boards. После установки перезапустите среду.
☑️ Проверка настроек перед компиляцией
Ошибки, связанные со структурой проекта
Arduino IDE требует, чтобы файл .ino лежал в папке с точно таким же именем. Если скетч называется robot.ino, а папка — robot_v2, среда предложит переместить файл, а при отказе возможны странные ошибки компиляции. То же относится к кириллице и пробелам в путях: имя пользователя Windows на русском языке иногда ломает сборку из-за путей к временным файлам.
Ещё один неочевидный случай — дублирование функций setup() или loop(). Если вы вставили пример из интернета поверх шаблона и не удалили старые функции, компилятор сообщит о переопределении: «redefinition of void setup()». Удалите дубликат, оставив одну версию каждой функции.
Типовые сообщения и их расшифровка
| Текст ошибки в логе | Вероятная причина | Что делать |
|---|---|---|
| expected ';' before... | Пропущена точка с запятой | Проверить указанную и предыдущую строки |
| was not declared in this scope | Опечатка или переменная не объявлена | Сверить регистр и объявление |
| No such file or directory | Библиотека не установлена | Установить через Менеджер библиотек |
| redefinition of 'void setup()' | Дублирующиеся функции | Удалить лишнюю копию функции |
| collect2: error: ld returned 1 | Ошибка линковки, конфликт символов | Искать дубли определений выше в логе |
Когда проблема глубже: среда и система
Если код заведомо рабочий (например, стандартный пример Blink), а компиляция всё равно падает — проблема в самой среде. Возможные причины: повреждённая установка ядра AVR, блокировка компилятора антивирусом, нехватка прав на запись во временные папки. Проверка проста: скомпилируйте Файл → Примеры → 01.Basics → Blink. Если и он не собирается, дело точно не в вашем коде.
В таком случае попробуйте переустановить пакет Arduino AVR Boards через Менеджер плат, а при неудаче — саму IDE, скачав актуальную версию с официального сайта Arduino. Антивирус на время проверки можно отключить или добавить папку Arduino в исключения.
Почему антивирус мешает компиляции
Компилятор avr-gcc и линковщик создают множество временных исполняемых файлов в системной папке Temp. Некоторые антивирусы блокируют запуск незнакомых .exe из временных каталогов, и сборка обрывается с невнятной ошибкой. Добавление папки Arduino и временной директории в исключения защиты обычно решает проблему.
⚠️ Внимание: не скачивайте «исправленные» версии компилятора или библиотек со сторонних сайтов. Используйте только Менеджер плат и Менеджер библиотек внутри Arduino IDE — так вы гарантированно получаете совместимые версии.
Что делать, если ничего не помогло
Остаётся системный подход: создайте новый пустой скетч и по частям переносите в него свой код, компилируя после каждого блока. Так вы локализуете фрагмент, который роняет сборку. Метод занимает время, но работает даже тогда, когда лог не даёт понятной подсказки.
При обращении за помощью на форумы всегда прикладывайте полный текст лога (включается подробным выводом в настройках) и полный код скетча. По одной строке «exit status 1» диагностировать проблему невозможно — это всё равно что описывать врачу болезнь словом «плохо».
Частые вопросы
Exit status 1 — это ошибка компиляции или загрузки?
Именно компиляции: скетч не превратился в машинный код, и до загрузки дело даже не дошло. Ошибки загрузки выглядят иначе — обычно это сообщения avrdude о таймауте или неверном ответе программатора.
Почему вчера скетч компилировался, а сегодня нет?
Частые причины: обновилась библиотека или ядро платы с изменением API, изменился путь к проекту, либо в код была внесена правка с опечаткой. Откатите последние изменения или версию обновлённой библиотеки через Менеджер библиотек.
Влияет ли выбор процессора ATmega328P (Old Bootloader) на компиляцию?
Как правило, нет — этот параметр влияет на процесс загрузки. Но если выбрана вообще другая плата (например, Uno вместо Nano или наоборот), компиляция обычно проходит, а вот загрузка и поведение пинов могут отличаться.
Может ли быть причиной русское имя пользователя Windows?
Да, это известная проблема: кириллица в путях к временным файлам иногда ломает работу компилятора. Решение — создать пользователя с латинским именем или перенастроить временную папку на путь без кириллицы.
Ошибка «collect2: error: ld returned 1 exit status» — это то же самое?
Это ошибка этапа линковки — финальной сборки объектных файлов. Причина указана выше в логе: чаще всего дублирование определений функций или переменных в разных файлах проекта. Ищите строки «multiple definition of» выше по тексту.