Я пытаюсь скомпилировать мою программу, и она возвращает эту ошибку:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
в моем make-файле я использую команду g++
и ссылку на мою библиотеку, которая является символической ссылкой на мою библиотеку, расположенную в другом каталоге.
Есть ли возможность добавить, чтобы он работал, пожалуйста?
-l
переключателя (например, libpthread.so, с которым вы уже связываетесь).Ответы:
Если ваша библиотека называется say
libxyz.so
и находится по пути, скажите:затем связать его с вашей программой:
источник
Чтобы выяснить, что ищет компоновщик, запустите его в подробном режиме.
Например, я столкнулся с этой проблемой, пытаясь скомпилировать MySQL с поддержкой ZLIB. Я получаю сообщение об ошибке во время компиляции:
Я занимался поиском в Google и продолжал сталкиваться с разными проблемами одного и того же типа, когда люди говорили, чтобы убедиться, что файл .so действительно существует, а если нет, то создать символическую ссылку на версионный файл, например, zlib. so.1.2.8. Но, когда я проверил, zlib.so существует. Итак, я подумал, конечно, это не может быть проблемой.
Я наткнулся на другой пост в интернете, в котором предлагалось запустить make с LD_DEBUG = all:
Хотя я получил тонну отладочной информации, на самом деле это не помогло. Это добавило больше путаницы, чем что-либо еще. Итак, я собирался сдаться.
Затем у меня было прозрение. Я подумал проверить текст справки по команде ld:
Из этого я понял, как запустить ld в подробном режиме (представьте, что):
Это вывод, который я получил:
Динь, динь, динь ...
Итак, чтобы наконец это исправить, чтобы я мог скомпилировать MySQL с моей собственной версией ZLIB (а не в комплекте):
Вуаля!
источник
-Xlinker --verbose
аргументы командной строки gcc, чтобы он передавал эту опцию ld.-Wl,-Bstatic
. Это ограничивает поиск только .a файлами. Подробный вариант ясно показал это. После того, как я удалил-Wl,-Bstatic
общие библиотеки, также был произведен поиск.-Wl,--verbose
и передает--verbose
компоновщику.-Wl,--verbose
чтобы передать подробный компоновщик.Кажется, что нет никакого ответа, который решает очень распространенную проблему новичка - не установить необходимую библиотеку.
На платформах Debianish, если они
libfoo
отсутствуют, вы часто можете установить их с чем-то вроде-dev
Версия пакета требуется для работы в области развития, даже тривиальные опытно -конструкторские работы , такие как компиляции исходного кода для ссылки на библиотеку.Имя пакета иногда требуется несколько украшений (
libfoo0-dev
?foo-dev
Безlib
префикса? И т.д.), или вы можете просто использовать для вашего дистрибутива поиска пакетов , чтобы выяснить , какие именно пакеты предоставляют конкретный файл.(Если их несколько, вам нужно выяснить, в чем их различия. Выбор наиболее крутого или самого популярного - это обычное сокращение, но не приемлемая процедура для любой серьезной работы по разработке.)
Для других архитектур (особенно RPM) применяются аналогичные процедуры, хотя детали будут другими.
источник
apt-get install libperl-dev
отсортировал это для меня. Спасибо :)yum install openssl-devel
решение проблемы.Время компиляции
Когда г ++ говорит
cannot find -l<nameOfTheLibrary>
, это означает , что г ++ посмотрел на файлlib{nameOfTheLibrary}.so
, но он не мог найти его в общей библиотеке пути поиска, который по умолчанию указывает на/usr/lib
и/usr/local/lib
и где - то еще , может быть.Чтобы решить эту проблему, вы должны либо указать библиотечный файл (
lib{nameOfTheLibrary}.so
) в этих путях поиска, либо использовать-L
параметр команды.-L{path}
говорит g ++ (фактическиld
) найти библиотечные файлы в пути{path}
в дополнение к путям по умолчанию.Пример. Предположим, у вас есть библиотека
/home/taylor/libswift.so
, и вы хотите связать свое приложение с этой библиотекой. В этом случае вы должны предоставить g ++ следующие опции:Примечание 1 :
-l
опция получает имя библиотеки безlib
и.so
в начале и в конце.Примечание 2. В некоторых случаях за именем файла библиотеки следует, например, его версия
libswift.so.1.2
. В этих случаях g ++ также не может найти файл библиотеки. Простой обходной путь для решения этой проблемы - создание символической ссылки наlibswift.so.1.2
вызываемый объектlibswift.so
.время выполнения
Когда вы связываете свое приложение с общей библиотекой, требуется, чтобы библиотека оставалась доступной при каждом запуске приложения. Во время выполнения ваше приложение (фактически динамический компоновщик) ищет свои библиотеки в
LD_LIBRARY_PATH
. Это переменная окружения, которая хранит список путей.Пример: В случае нашего
libswift.so
примера, динамический компоновщик не может найтиlibswift.so
вLD_LIBRARY_PATH
(что указывает на поиск по умолчанию путей). Чтобы устранить проблему, вы должны добавить эту переменную с путемlibswift.so
в.источник
.so
файлы/usr/lib
, но мне стало интересно,export
поможет ли это. Несмотря на то, что процесс установкиmake
продолжался дольше, произошла другая ошибка. На этот раз,.so.0
файл не был найден, но , как.so
и.so.0
файл был в директории , где у меня есть сборки зависимого пакет от источника. Не могли бы вы помочь с этим?Во время компиляции с
g++
помощьюmake
define определить,LIBRARY_PATH
может быть, неуместно изменить Makefile с помощью-L
опции. Я положил свою дополнительную библиотеку,/opt/lib
поэтому я сделал:а затем побежал
make
для успешной компиляции и компоновки.Для запуска программы с общей библиотекой определите:
перед выполнением программы.
источник
Во-первых, вам нужно знать правило именования
lxxx
:lc
значитlibc.so
,lltdl
значитlibltdl.so
,lXtst
значитlibXts.so
.Итак, это
lib
+lib-name
+.so
Как только мы узнаем имя, мы сможем
locate
найти путь к этомуlxxx.so
файлу.Если вы не можете найти его, вам нужно установить его
yum
(я использую CentOS). Обычно у вас есть этот файл, но он не ссылается на нужное место.Ссылка это в нужном месте, обычно это
/lib64
или/usr/lib64
$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/
Выполнено!
ссылка: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
источник
locate
работает только если он установлен и работает регулярно. Необработанный обходной путь - запуститьfind
весь диск, но, конечно, это займет время. Если вы обнаружите, что делаете это часто, рассмотрите возможность установки,locate
чтобы снизить (интерактивные, человеческие) затраты на эту операцию.Когда вы компилируете свою программу, вы должны указать путь к библиотеке; в g ++ используйте опцию -L:
источник
ccmake
чтобыMakefile
оно создавалось с флагом привязки? Я хочу связать свой-lARToolkitPlus
флаг с путем.Эта ошибка также может быть вызвана, если символическая ссылка на динамическую библиотеку, .so, но по устаревшим причинам
-static
появляется среди флагов ссылки. Если это так, попробуйте удалить его.источник
Проверьте местоположение вашей библиотеки, например, lxxx.so:
Если его нет в
/usr/lib
папке, введите:Выполнено.
источник
Помимо ответов, которые уже были даны, может быть и так, что файл * .so существует, но не имеет правильного имени. Или может быть так, что файл * .so существует, но он принадлежит другому пользователю / root.
Проблема 1: неправильное имя
Если вы ссылаетесь на файл как
-l<nameOfLibrary>
тогда, имя файла библиотеки ДОЛЖНО иметь форму.lib<nameOfLibrary>
Если у вас есть только<nameOfLibrary>.so
файл, переименуйте его!Выпуск 2: Неправильный владелец
Чтобы убедиться, что это не проблема - сделайте
Если файл принадлежит пользователю root или другому пользователю, вам нужно сделать
источник
Библиотека, на которую я пытался сослаться, оказалась с нестандартным именем (то есть без префикса 'lib'), поэтому они рекомендовали использовать такую команду для ее компиляции -
gcc test.c -Iinclude lib/cspice.a -lm
источник
Вот информация об Ubuntu моего ноутбука.
Я использую locate, чтобы найти .so файлы для boost_filesystem и boost_system
Затем свяжите .so файлы с / usr / lib и переименуйте в .so
Выполнено! R пакет velocyto.R был успешно установлен!
источник
Я столкнулся с тем же сообщением об ошибке.
Я построил
cmocka
какso
и попытался связать его с моим исполняемым файлом. Ноld
всегда жалуется ниже:Оказывается, после сборки создается 3 файла
cmocka
:1 и 2 - символьные ссылки, и только 3 - настоящий файл.
Я только скопировал 1 в мою папку библиотеки, где
ld
не удалось найти 3.После того как я скопировал все 3,
ld
работает.источник