usr/bin/ld: cannot find -l

Я пытаюсь скомпилировать свою программу, и она выдает ошибку:

usr/bin/ld: cannot find -l<nameOfTheLibrary>

В моем makefile я использую команду g++ и ссылаюсь на мою библиотеку, которая является символической ссылкой на мою библиотеку, расположенную в другом каталоге.

Есть ли опция, которую нужно добавить, чтобы это работало?

Комментарии к вопросу (9)

Чтобы узнать, что ищет компоновщик, запустите его в режиме verbose.

Например, я столкнулся с этой проблемой при попытке скомпилировать MySQL с поддержкой ZLIB. Во время компиляции я получал ошибку, подобную этой:

/usr/bin/ld: cannot find -lzlib

Я немного погуглил и наткнулся на различные проблемы такого же рода, где люди говорили, что нужно убедиться, что файл .so действительно существует, а если его нет, то создать симлинк на файл с версией, например, zlib.so.1.2.8. Но когда я проверил, zlib.so существовал. Поэтому я подумал, что, конечно же, проблема не может быть в этом.

Я наткнулся на другой пост в Интернете, в котором предлагалось запустить make с LD_DEBUG=all:

LD_DEBUG=all make

Хотя я получил огромное количество отладочных данных, на самом деле это не помогло. Это добавило больше путаницы, чем чего-либо еще. Поэтому я уже собирался сдаться.

Затем я прозрел. Я решил проверить текст справки для команды ld:

ld --help

Из него я понял, как запустить ld в режиме verbose (представьте себе):

ld -lzlib --verbose

Вот какой результат я получил:

==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
attempt to open /usr/local/lib64/libzlib.so failed
attempt to open /usr/local/lib64/libzlib.a failed
attempt to open /lib64/libzlib.so failed
attempt to open /lib64/libzlib.a failed
attempt to open /usr/lib64/libzlib.so failed
attempt to open /usr/lib64/libzlib.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
attempt to open /usr/local/lib/libzlib.so failed
attempt to open /usr/local/lib/libzlib.a failed
attempt to open /lib/libzlib.so failed
attempt to open /lib/libzlib.a failed
attempt to open /usr/lib/libzlib.so failed
attempt to open /usr/lib/libzlib.a failed
/usr/bin/ld.bfd.real: cannot find -lzlib

Дзинь, дзинь, дзинь...

Итак, чтобы окончательно исправить это, я смог скомпилировать MySQL с моей собственной версией ZLIB (а не с поставляемой версией):

sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so

Вуаля!

Комментарии (20)
Решение

Если имя вашей библиотеки, скажем, libxyz.so и она расположена по пути, скажем:

/home/user/myDir

то чтобы связать ее с вашей программой:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Комментарии (9)

Там не представляется какой-либо ответ, который затрагивает очень распространенная проблема новичка не в состоянии установить необходимые библиотеки в первую очередь.

На Debianish платформ, если libfoo отсутствует, вы можете часто установить его с чем-то подобным

apt-get install libfoo-dev

В -dev версию пакета необходимых для разработки, даже тривиальный разработках, таких как компиляция исходного кода в ссылку в библиотеку.

Имя пакета иногда требуют некоторые украшения (libfoo0-Дев? фу-дев без префикса либерал? и т. д.), Или вы можете просто использовать ваш дистрибутив'ы пакет search, чтобы узнать точно, какие пакеты дают определенный файл.

(Если есть больше чем один, вы должны выяснить, что их различия. Выбирая самые крутые или самые популярные-общепринятое сокращение, но не приемлемая процедура для любой серьезной работы развитию.)

Для других архитектур (особенно об / мин) аналогичные процедуры применяются, хотя детали будут разные.

Комментарии (5)

Время Компиляции

Когда G++ говорит не могу найти -л<nameOfTheLibrary>, это означает, что G++ искали файл Либ{nameOfTheLibrary}.так, но он не мог&#39;т найти его в общий путь поиска библиотеки, которая по умолчанию указывает на/УСР/Либ " и " /usr/местные/библиотека и где-то еще может быть.

Для решения этой проблемы, вы должны либо предоставить файл библиотека (Либ{nameOfTheLibrary}.так) в этих путей поиска или использовать опцию-L команды. -Л{путь} говорит г++ (на самом деле ЛД), чтобы найти файлы библиотеки в путь {путь} в дополнение к пути по умолчанию.

Пример: если у вас есть библиотека `/главная/Тейлор/libswift.Итак, и вы хотите связать свое приложение с этой библиотекой. В этом случае вы должны поставить г++ со следующими параметрами:

g++ main.cpp -o main -L/home/taylor -lswift
  • Примечание 1: вариант получает название Библиотека без либерал и `.так на ее начало и конец.

  • Примечание 2: в некоторых случаях, в библиотеке имени файла с последующим его версии, для libswift экземпляр.так.1.2. В этих случаях г++ также не может найти файл библиотеки. Простое решение, чтобы исправить это создает символическую ссылку на libswift.так.1.2 "под названием" libswift.так.


# Выполнения#

Когда вы ссылку на ваше приложение в общей библиотеке, Это's требовало, что библиотека остается доступен всякий раз, когда вы запустите приложение. Во время выполнения вашего приложения (на самом деле динамический компоновщик) ищет библиотеки в переменной LD_LIBRARY_PATH`. Это's в среду переменная, которая хранит список путей.

Пример: в случае libswift наши.так, например, динамический компоновщик не может найти libswift.так в переменной LD_LIBRARY_PATH (что указывает на пути поиска по умолчанию). Чтобы исправить проблему, вы должны добавить эту переменную с libswift путь`.так это в.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
Комментарии (0)

При компиляции с G++ ичерезпринятьопределениеlibrary_path указано, если это не возможно, чтобы изменить Makefile с-Л'option. Я положил мои дополнительные библиотеки в папку/opt/Либ-так я и сделал:

$ export LIBRARY_PATH=/opt/lib/

а потом побежал делать для успешной компиляции и линковки.

Для запуска программы с общей библиотекой, определить:

$ export LD_LIBRARY_PATH=/opt/lib/

перед выполнением программы.

Комментарии (0)

Во-первых, вы должны знать правила именования ограничения имеются для распространения информации:

/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst

ЛНР означает библиотеки libc.так, lltdl означает libltdl.так, lXtst означает libXts.так.

Таким образом, это либерал + имя lib + `.так


Как только мы знаем имя, мы можем использовать найти, чтобы найти путь из этого ограничения имеются для распространения информации.так файл`.


$ locate libiconv.so
/home/user/anaconda3/lib/libiconv.so   # 
Комментарии (1)

Когда вы компилируете свою программу, вы должны указать путь к библиотеке; в g++ используйте опцию -L:

g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
Комментарии (2)

Проверьте расположение вашей библиотеки, например ограничения имеются для распространения информации.так:

locate lxxx.so

Если его нет в каталоге/usr/lib в папку, типа этого:

sudo cp yourpath/lxxx.so /usr/lib

Сделано.

Комментарии (1)

Эта ошибка может также быть достигнуто, если символическая ссылка является динамической библиотекой .так, но для устаревших причинам `-статический появляется среди флагов ссылке. Если да, попробуйте удалить его.

Комментарии (0)

Кроме ответы уже даны, он также может быть дело в том, что .так что файл существует, но не назвал правильно. Или это может быть так, что .так что файл существует, но он принадлежит другому пользователю / корень.

Вопрос 1: неправильное название

Если вы связываете файл -л<nameOfLibrary> затем библиотека имени файла должно быть в формате Либ Если у вас есть только.так что файл, переименовать его!

Вопрос 2: Неправильная хозяйка

Чтобы убедиться, что это не проблема - сделаем

ls -l /path/to/.so/file

Если файл принадлежит пользователю root или другим пользователем, вам нужно сделать

sudo chown yourUserName:yourUserName /path/to/.so/file
Комментарии (0)

Я пытался перейти по ссылке, как оказалось, имеет нестандартное имя (т. е. не'т с префиксом 'Либ'), поэтому их рекомендуется использовать эту команду, чтобы скомпилировать его -

тест ССЗ.с-включите Либ/cspice.а-лм`

Комментарии (1)

Вот информация с Ubuntu на моем ноутбуке.

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

Я использую найти, чтобы найти .так файлы для boost_filesystem и boost_system

locate libboost_filesystem
locate libboost_system

Тогда ссылку .так что файлы в /usr/lib и переименовать .так

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 /usr/lib/libboost_filesystem.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 /usr/lib/libboost_system.so

Молодец! Velocyto пакета R.Р был успешно установлен!

Комментарии (0)