gcc: fatal error — no such file or directory (отсутствует заголовочный файл)

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

Компилятор не нашёл заголовочный файл: не установлен пакет разработки или путь включения не указан. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Системные библиотеки
  5. Заголовки проекта
  6. Опечатки и окружение

#Что означает ошибка

Сообщение
fatal error: openssl/ssl.h: No such file or directory

fatal error: foo.h: No such file or directory при компиляции означает, что компилятор не нашёл заголовочный файл. Либо не установлен dev-пакет библиотеки, либо путь к заголовкам не передан компилятору флагом -I, либо опечатка в #include.

Определите, чей это заголовок: вашего проекта или системной библиотеки.

Затем выберите решение.

Компилятор не нашёл заголовочный файл: не установлен пакет разработки или путь включения не указан. Установите пакет -dev (-devel) нужной библиотеки.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Нет dev-пакетаlibssl-dev.Установите.
Путь включения-I.Укажите.
ОпечаткаИмя.Проверьте.
Другая платформаmacOS.Brew.

#Пошаговое решение

  1. Определите, какой заголовок не найденОткройте терминал в каталоге исходного проекта и повторите точную команду компиляции. Найдите строку fatal error: ...: No such file or directory и выпишите имя заголовка из #include, а также путь к исходному файлу. Если ошибка сообщает gcc: error: file.c: No such file or directory, отсутствует сам исходный файл, и поиск dev-пакета не поможет. Проверьте pwd, ls и относительный путь к .c/.cpp.
  2. Найдите пакет, содержащий файлЕсли не найден системный или библиотечный заголовок, определите, какой пакет его предоставляет: Debian/Ubuntu — apt-file search ИМЯ_ЗАГОЛОВКА (если apt-file отсутствует, его установка и apt-file update требуют прав администратора); Fedora/RHEL — dnf provides '*/ИМЯ_ЗАГОЛОВКА'. Имя замените фактическим, например openssl/ssl.h. Проверьте вывод и происхождение пакета, не ставьте пакет по угаданному имени libXXX-dev. На другой системе используйте её менеджер пакетов.
  3. Установите dev-пакетЕсли проекту нужна библиотека OpenSSL и именно её заголовок отсутствует на Debian/Ubuntu, администратор может установить libssl-dev через sudo apt install libssl-dev, но это пример для конкретной зависимости. Для других библиотек выберите соответствующий пакет разработки и версию. После установки проверьте существование заголовка ls /usr/include/openssl/ssl.h (для OpenSSL на типичной Linux-системе) и повторите прежнюю команду компиляции. Не устанавливайте большие наборы пакетов, если отсутствует ваш собственный заголовок.
  4. Передайте путь флагом -IДля заголовков, лежащих в каталоге проекта, сравните строку #include с реальным деревом каталогов и параметрами сборки. Если код использует #include "myheader.h", проверьте файл в том же каталоге исходника и дополнительные каталоги поиска компилятора. Добавьте правильный путь -Iпуть/к/заголовкам в систему сборки (Makefile/CMake), а не к абсолютному случайному каталогу; если пакет предоставляет pkg-config, используйте pkg-config --cflags ИМЯ_МОДУЛЯ и документацию библиотеки. Параметр -I только ищет заголовки и не обеспечивает линковку.
  5. Проверьте регистр и кавычки в includeПроверьте точное написание и регистр: в Linux Header.h и header.h различаются. Для #include <...> не меняйте системный заголовок ради исправления ошибки; для своего проекта при переименовании файла обновите ссылки во всех исходниках и системе сборки. Повторите исходную команду, а если ошибка стала undefined reference, это уже этап компоновки: отдельно проверьте pkg-config --libs или флаги -l, а не добавляйте новые каталоги -I без диагностики.
  6. Установка пакета — лишь пример по конкретному заголовку
    Linux · Терминал (Bash)КомандаНужен sudo
    Установка пакета — лишь пример по конкретному заголовку. Не запускайте по другой ошибке.
    # Только для Debian/Ubuntu и OpenSSL, если отсутствует openssl/ssl.h:
    sudo apt install libssl-dev

#Системные библиотеки

Найдите пакет с файлом: Debian/Ubuntu — apt-file search foo.h (после sudo apt install apt-file && sudo apt-file update), Fedora — dnf provides "*/foo.h", Arch — pacman -F foo.h. Установите dev-пакет (например, libssl-dev, zlib1g-dev, libcurl4-openssl-dev). Проверьте, что файл появился: ls /usr/include/foo.h.

#Заголовки проекта

Добавьте путь поиска: gcc -Iinclude main.c -o main или CFLAGS += -Iinclude в Makefile; в CMake — target_include_directories(app PRIVATE include). Для сторонних библиотек в нестандартном каталоге: -I/opt/foo/include и при линковке -L/opt/foo/lib -lfoo. Используйте pkg-config --cflags --libs foo, чтобы получить нужные флаги: gcc main.c $(pkg-config --cflags --libs foo).

#Опечатки и окружение

Проверьте регистр имён (Linux чувствителен к регистру): #include "Foo.h" ≠ foo.h. Для заголовков проекта используйте кавычки, для системных — угловые скобки. Узнайте пути поиска: gcc -xc -E -v - < /dev/null (раздел #include <...> search starts here). При кросс-компиляции заголовки целевой платформы лежат в sysroot. Проверьте окончания строк и права доступа.

Linux · Терминал (Bash)Команда
Команды относятся к Debian/Ubuntu с apt-file и pkg-config. Если их нет, используйте штатные инструменты вашей ОС.
# Диагностика: замените openssl/ssl.h и openssl на нужный заголовок и имя модуля
apt-file search openssl/ssl.h
pkg-config --cflags --libs openssl
# Список каталогов поиска заголовков GCC (не изменяет файлы)
gcc -xc -E -v - < /dev/null

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.