Команда make завершилась ошибкой undefined reference, а в терминале красным выделено отсутствие заголовочного файла — типичная картина первой попытки собрать программу из исходников. Причина почти всегда одна: не установлены зависимости или не выполнен этап конфигурации перед компиляцией.
Сборка приложения из исходного кода — задача вполне решаемая, если понимать общий принцип: сначала получаем код, затем устанавливаем инструменты и зависимости, после чего запускаем систему сборки. В этой статье разберём весь процесс от клонирования репозитория до готового исполняемого файла, а также типичные ошибки и способы их диагностики.
Что нужно подготовить перед сборкой
Прежде чем запускать компиляцию, убедитесь, что в системе установлен базовый набор инструментов. Для Linux-дистрибутивов это обычно компилятор (gcc или clang), утилита make и система контроля версий Git. В Debian и Ubuntu всё это ставится одним метапакетом:
sudo apt install build-essential git
На Windows для сборки нативных программ чаще используют Visual Studio Build Tools или среду MSYS2 с менеджером пакетов pacman. Для Android-приложений потребуется Android Studio и установленный JDK — без него Gradle не запустится вовсе.
- 🔧 Компилятор: gcc/clang на Linux, MSVC или MinGW на Windows
- 📦 Git для клонирования репозитория с исходниками
- 📖 Прочитанный файл
README.mdилиBUILDING.mdв корне проекта - 💾 Свободное место на диске — крупные проекты при сборке занимают заметный объём
⚠️ Внимание: собирайте код только из доверенных источников — официального репозитория проекта или проверенного форка. Архивы с исходниками из непонятных файлообменников могут содержать вредоносные вставки, которые выполнятся уже на этапе сборки.
Получение исходного кода
Самый надёжный способ — клонировать официальный репозиторий. Ссылку на него ищите на сайте проекта или на странице в каталоге приложений. Стандартная команда выглядит так:
git clone https://github.com/автор/проект.git
cd проект
Если нужна стабильная версия, а не последний код из ветки разработки, переключитесь на конкретный тег релиза командой git checkout с именем тега. Список доступных тегов показывает git tag. Это важно: код в основной ветке может быть нестабильным или находиться в середине рефакторинга.
Альтернатива — скачать архив исходников (tarball или zip) со страницы релизов. Такой вариант подходит, если Git не установлен, но теряется возможность быстро переключаться между версиями и получать исправления.
Определяем систему сборки проекта
Чтобы понять, как именно собирать проект, посмотрите, какие файлы лежат в его корне. Именно они указывают на используемую систему сборки — универсальной команды для всех проектов не существует.
| Файл в корне | Система сборки | Типичная команда |
|---|---|---|
| configure, Makefile.am | Autotools | ./configure && make |
| CMakeLists.txt | CMake | cmake -B build && cmake --build build |
| build.gradle | Gradle (Android/Java) | ./gradlew assembleRelease |
| Cargo.toml | Cargo (Rust) | cargo build --release |
| package.json | npm/yarn (Node.js) | npm install && npm run build |
Если в корне лежит просто Makefile без configure, достаточно выполнить make. Если ничего из перечисленного нет — ищите инструкцию в документации проекта: некоторые используют собственные скрипты сборки вроде build.sh.
Пошаговая сборка: классический сценарий
Разберём самый распространённый путь — проект на CMake, который сегодня используется в большинстве кроссплатформенных C/C++ программ. Порядок действий следующий:
mkdir build && cd build
cmake ..
make -j$(nproc)
Первый шаг создаёт отдельный каталог для артефактов сборки — так исходники остаются чистыми. Команда cmake .. проверяет наличие компилятора и зависимостей, генерируя файлы для make. Флаг -j с числом потоков ускоряет компиляцию за счёт параллельной работы ядер процессора.
☑️ Чек-лист успешной сборки
После завершения исполняемый файл обычно появляется в каталоге сборки. Чтобы установить программу в систему, выполняют sudo make install — но предварительно стоит убедиться, что проект вообще предусматривает такой шаг, это указано в его документации.
⚠️ Внимание: установка через make install обходит пакетный менеджер, и удалить такую программу потом сложнее. Если планируете часто обновлять или удалять ПО, рассмотрите создание пакета через checkinstall или сборку в изолированном окружении.
Зависимости: главный источник ошибок
Абсолютное большинство неудачных сборок упирается в отсутствующие зависимости — библиотеки, которые проект использует, но не содержит в своём коде. На Linux их ставят в виде dev-пакетов: например, libssl-dev или libpng-dev. Суффикс -dev (или -devel в RPM-дистрибутивах) означает, что помимо самой библиотеки установятся заголовочные файлы, нужные компилятору.
Как понять, чего именно не хватает? Читайте вывод ошибки снизу вверх: искомое имя обычно в первых строках сообщения об ошибке, а не в последних. Фраза вида Could NOT find <имя> от CMake или No such file or directory с упоминанием заголовка прямо указывает на недостающий компонент.
Как найти нужный dev-пакет по имени файла
В Debian и Ubuntu помогает утилита apt-file: установите её, обновите индекс командой apt-file update, затем ищите нужный заголовок через apt-file search имя_файла.h. В Fedora аналогичную задачу решает dnf provides */имя_файла.h.
Для проектов на Python, Node.js или Rust зависимости подтягиваются автоматически собственными менеджерами пакетов — pip, npm, cargo. Там главное — не забыть шаг установки зависимостей перед запуском сборки и использовать виртуальное окружение, чтобы не засорять систему.
Сборка Android-приложения из исходников
Для APK-файлов процесс выглядит иначе. Вам понадобится Android Studio с установленным SDK либо только командная строка с Gradle. Клонировав репозиторий, откройте проект в Android Studio — среда сама предложит синхронизировать Gradle и докачать нужные версии SDK.
Сборка из терминала выполняется обёрткой Gradle:
./gradlew assembleDebug
Результат — APK в каталоге app/build/outputs/apk/. Отладочная сборка подписывается автоматически тестовым ключом, а вот релизный APK потребует собственного ключа подписи — без него приложение не установится на устройство как обновление и не попадёт в магазины. Созданный ключ подписи храните в надёжном месте: потеряв его, вы не сможете выпускать обновления своего приложения под тем же именем пакета.
Диагностика типичных ошибок
Даже опытные разработчики регулярно сталкиваются со сбоями сборки. Вот наиболее частые сценарии и направления проверки:
- 🧩 Ошибка на этапе configure/cmake — не хватает библиотеки или её версия ниже требуемой; проверьте сообщение об ошибке и установите нужный dev-пакет
- 🔨 Ошибка компиляции в середине процесса — возможное несоответствие версии компилятора; сверьте требования в документации проекта
- 🔗 Ошибки линковки (undefined reference) — библиотека найдена, но не подключена; проверьте флаги и пути к библиотекам
- 💥 Сборка падает случайным образом — попробуйте убрать параллелизм (убрать флаг
-j), иногда это указывает на нехватку оперативной памяти
Если ничего не помогает, полезно собрать проект с нуля в чистом каталоге: удалите папку сборки и повторите конфигурацию. Закэшированные настройки предыдущих попыток нередко мешают корректной работе.
Часто задаваемые вопросы
Можно ли собрать приложение из исходников без навыков программирования?
Да, если проект хорошо документирован. Сборка сводится к выполнению команд из README — писать код не требуется. Сложности возникают лишь при ошибках, где нужно вчитываться в сообщения компилятора.
Чем сборка из исходников лучше установки готового пакета?
Вы получаете самую свежую версию, можете включить или отключить нужные функции через параметры конфигурации и убеждаетесь, что бинарный файл соответствует опубликованному коду. Минус — время и необходимость разбираться с зависимостями.
Что делать, если в проекте нет README и инструкций по сборке?
Ищите файлы систем сборки: CMakeLists.txt, Makefile, build.gradle, Cargo.toml или package.json — по ним определяется нужная команда. Также загляните в каталог docs и в историю коммитов, иногда инструкции находятся там.
Безопасно ли собирать и запускать чужой код?
Только из доверенных источников. Скрипты сборки выполняются с вашими правами пользователя и теоретически могут содержать вредоносные команды. Сомнительные проекты безопаснее собирать в виртуальной машине или контейнере.
Почему собранная программа не запускается, хотя компиляция прошла успешно?
Возможная причина — отсутствие динамических библиотек в путях загрузчика. Проверить это на Linux помогает команда ldd с путём к исполняемому файлу: она покажет, какие библиотеки не найдены. Также убедитесь, что у файла есть права на исполнение.