#Что означает ошибка
undefined reference
Нет библиотеки или неверный порядок линковки. Установите dev-пакет, укажите -L и -l и проверьте порядок.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет dev-пакета | Сообщение cannot find -lNAME. | Установите dev-библиотеку подходящей архитектуры. |
| Порядок -l | Символ определён, но объектное звено идёт после библиотеки. | Исправьте порядок объектов и -l. |
| Нет -L | Путь к пользовательской библиотеке отсутствует. | Используйте документированный -L или pkg-config. |
| Разная ABI | Архитектура или ABI библиотеки не совпадает. | Соберите совместимую библиотеку и компилятор. |
#Пошаговое решение
- Сохраните полную команду компоновкиОткройте терминал проекта и повторите сборку с подробным выводом (для CMake
cmake --build build --verbose). Найдите строкуundefined reference to ...либоcannot find -lNAME. Первая говорит об отсутствующем определении символа, вторая — о ненайденной библиотеке; это разные действия. - Если библиотека не найденаПроверьте наличие файла
libNAME.soилиlibNAME.aв путях библиотеки и dev-пакета. В Linux выполнитеpkg-config --libs ИМЯ_ПАКЕТАпосле установки официального пакета разработки; имя пакета берите из документации проекта. Сверьте архитектуру черезfile имя_библиотеки, не подсовывайте библиотеки другой платформы. - Если ссылка на символ не разрешенаСверьте точное написание функции и её сигнатуру, наличие исходного файла в целях сборки и порядок аргументов в ручной команде
g++: объектные файлы обычно должны идти перед-l.... Для C++ проверьте совместимость компиляторов и ABI. Не создавайте фиктивную реализацию и не удаляйте сообщения компоновщика из настроек. - Проверьте окончательную сборкуВыполните сборку прежним инструментом и проверьте, что появилась исполняемая программа или библиотека. Если
cannot find -lсменилось наundefined reference, это отдельный этап диагностики — приложите точную команду, платформу, список библиотек и первые строки ошибок.
#Если проблема осталась
Если «Компоновщик: undefined reference / cannot find -l» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.