Ошибка линковки: /usr/bin/ld: cannot find -l<имя_библиотеки> в C++ на Linux
Причина ошибки и её решение
Ошибка /usr/bin/ld: cannot find -l<имя> возникает, когда линковщик (ld) не может найти библиотеку с указанным именем. В вашем случае -lpng ищет файл libpng.so или libpng.a, но находит libpng16.so. Это распространённая ситуация в Linux: библиотека libpng — это символическая ссылка на libpng16, которая может отсутствовать.
Как исправить
Вам нужно указать правильное имя библиотеки — libpng16:
g++ main.cpp -o test -lpng16
Если это не сработает, проверьте, установлена ли символическая ссылка:
ls -la /usr/lib/x86_64-linux-gnu/libpng.so
Если ссылка отсутствует, создайте её вручную:
sudo ln -s /usr/lib/x86_64-linux-gnu/libpng16.so /usr/lib/x86_64-linux-gnu/libpng.so
После этого команда g++ main.cpp -o test -lpng будет работать.
Почему так происходит?
В Linux библиотеки могут иметь разные версии (например, libpng16 — версия 1.6). Пакет libpng-dev устанавливает актуальную версию, но не всегда создаёт ссылку libpng.so. Линковщик ищет точное имя, указанное после -l. Если вы пишете -lpng, он ищет libpng.so, а находит только libpng16.so.
Как правильно линковать библиотеки в C++
- Флаг
-l— указывает имя библиотеки без префиксаlibи расширения.-lpng=libpng.so. - Флаг
-L— добавляет путь для поиска библиотек. Например:-L/usr/local/lib. - Флаг
-I— для заголовочных файлов (не относится к линковке).
Проверка установленных библиотек
Используйте pkg-config — утилиту, которая автоматически подставляет флаги:
g++ main.cpp -o test $(pkg-config --cflags --libs libpng)
Если pkg-config выдаёт ошибку, установите pkg-config и проверьте, есть ли файл .pc:
pkg-config --list-all | grep png
Для libpng обычно работает libpng16:
g++ main.cpp -o test $(pkg-config --cflags --libs libpng16)
Пример полной компиляции
# Вариант 1: явное имя библиотеки
g++ main.cpp -o test -lpng16
# Вариант 2: через pkg-config
g++ main.cpp -o test $(pkg-config --cflags --libs libpng16)
# Вариант 3: с указанием пути (если библиотека в нестандартном месте)
g++ main.cpp -o test -L/usr/lib/x86_64-linux-gnu -lpng16
Что делать, если ошибка остаётся?
- Проверьте, установлен ли пакет
libpng-dev:dpkg -l | grep libpng. - Убедитесь, что архитектура библиотеки совпадает с системой (32-битная vs 64-битная).
- Попробуйте переустановить пакет:
sudo apt install --reinstall libpng-dev.
Если ничего не помогает, создайте символическую ссылку, как показано выше. Это безопасно и решает проблему в 90% случаев.
<<Альтернативный подход: статическая линковка
Если вы хотите избавиться от зависимостей от динамических библиотек, можно слинковать статическую версию. Для этого используйте флаг -static:
g++ main.cpp -o test -static -lpng16
Но учтите: статическая линковка увеличивает размер исполняемого файла и может потребовать установки статических версий библиотек (пакет libpng-static).
Другой вариант: проверка путей поиска
Линковщик ищет библиотеки в стандартных каталогах (/usr/lib, /usr/local/lib и т.д.). Если ваша библиотека находится в нестандартном месте, укажите путь явно:
g++ main.cpp -o test -L/путь/к/библиотеке -lpng
Проверить, какие пути использует ld, можно командой:
ld --verbose | grep SEARCH_DIR
Использование cmake для упрощения
Для больших проектов рекомендую использовать систему сборки CMake. Она автоматически находит библиотеки через find_package:
cmake_minimum_required(VERSION 3.10)
project(test)
find_package(PNG REQUIRED)
add_executable(test main.cpp)
target_link_libraries(test PNG::PNG)
Это избавляет от ручного указания флагов и решает проблему с именами библиотек.
Ответов пока нет.
Войдите чтобы оставить ответ