Я пытаюсь скомпилировать свою программу, и она выдает ошибку:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
В моем makefile я использую команду g++
и ссылаюсь на мою библиотеку, которая является символической ссылкой на мою библиотеку, расположенную в другом каталоге.
Есть ли опция, которую нужно добавить, чтобы это работало?
Чтобы узнать, что ищет компоновщик, запустите его в режиме verbose.
Например, я столкнулся с этой проблемой при попытке скомпилировать MySQL с поддержкой ZLIB. Во время компиляции я получал ошибку, подобную этой:
/usr/bin/ld: cannot find -lzlib
Я немного погуглил и наткнулся на различные проблемы такого же рода, где люди говорили, что нужно убедиться, что файл
Я наткнулся на другой пост в Интернете, в котором предлагалось запустить 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
Вуаля!
Если имя вашей библиотеки, скажем, libxyz.so
и она расположена по пути, скажем:
/home/user/myDir
то чтобы связать ее с вашей программой:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Там не представляется какой-либо ответ, который затрагивает очень распространенная проблема новичка не в состоянии установить необходимые библиотеки в первую очередь.
На Debianish платформ, если libfoo
отсутствует, вы можете часто установить его с чем-то подобным
apt-get install libfoo-dev
В -dev версию
пакета необходимых для разработки, даже тривиальный разработках, таких как компиляция исходного кода в ссылку в библиотеку.
Имя пакета иногда требуют некоторые украшения (libfoo0-Дев
? фу-дев
без префикса либерал
? и т. д.), Или вы можете просто использовать ваш дистрибутив'ы пакет search, чтобы узнать точно, какие пакеты дают определенный файл.
(Если есть больше чем один, вы должны выяснить, что их различия. Выбирая самые крутые или самые популярные-общепринятое сокращение, но не приемлемая процедура для любой серьезной работы развитию.)
Для других архитектур (особенно об / мин) аналогичные процедуры применяются, хотя детали будут разные.
Когда G++ говорит не могу найти -л<nameOfTheLibrary>
, это означает, что G++ искали файл Либ{nameOfTheLibrary}.так, но он не мог'т найти его в общий путь поиска библиотеки, которая по умолчанию указывает на
/УСР/Либ " и " /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
При компиляции с G++ ичерез
принятьопределение
library_path указано, если это не возможно, чтобы изменить Makefile с-Л'option. Я положил мои дополнительные библиотеки в папку/opt/Либ-так я и сделал:
$ export LIBRARY_PATH=/opt/lib/
а потом побежал делать для успешной компиляции и линковки.
Для запуска программы с общей библиотекой, определить:
$ export LD_LIBRARY_PATH=/opt/lib/
перед выполнением программы.
Во-первых, вы должны знать правила именования ограничения имеются для распространения информации
:
/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 # <-- right here
/home/user/anaconda3/lib/libiconv.so.2
/home/user/anaconda3/lib/libiconv.so.2.5.1
/home/user/anaconda3/lib/preloadable_libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2.5.1
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/preloadable_libiconv.so
Если вы не можете найти его, вам нужно установить его на ям
(я использую в CentOS). Обычно у вас есть этот файл, но это не Ссылка на нужное место.
Связать его в нужное место, обычно это /lib64
или /usr/lib64
$ судо ЛН-с /главная/пользователя/anaconda3 в/lib/libiconv.так в /usr/lib64/
Молодец!
Реф: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
Проверьте расположение вашей библиотеки, например ограничения имеются для распространения информации.так:
locate lxxx.so
Если его нет в каталоге/usr/lib в папку
, типа этого:
sudo cp yourpath/lxxx.so /usr/lib
Сделано.
Кроме ответы уже даны, он также может быть дело в том, что .так что файл существует, но не назвал правильно. Или это может быть так, что .так что файл существует, но он принадлежит другому пользователю / корень.
Вопрос 1: неправильное название
Если вы связываете файл -л<nameOfLibrary>
затем библиотека имени файла должно быть в формате Либ Если у вас есть только
Вопрос 2: Неправильная хозяйка
Чтобы убедиться, что это не проблема - сделаем
ls -l /path/to/.so/file
Если файл принадлежит пользователю root или другим пользователем, вам нужно сделать
sudo chown yourUserName:yourUserName /path/to/.so/file
Я пытался перейти по ссылке, как оказалось, имеет нестандартное имя (т. е. не'т с префиксом 'Либ'), поэтому их рекомендуется использовать эту команду, чтобы скомпилировать его -
тест ССЗ.с-включите Либ/cspice.а-лм`
Вот информация с 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.Р был успешно установлен!