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