Дополнительно
usr/bin/ld: cannot find -l
Я пытаюсь скомпилировать свою программу, и она выдает ошибку:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
В моем makefile я использую команду g++
и ссылаюсь на мою библиотеку, которая является символической ссылкой на мою библиотеку, расположенную в другом каталоге.
Есть ли опция, которую нужно добавить, чтобы это работало?
396
12
Чтобы узнать, что ищет компоновщик, запустите его в режиме verbose.
Например, я столкнулся с этой проблемой при попытке скомпилировать MySQL с поддержкой ZLIB. Во время компиляции я получал ошибку, подобную этой:
Я немного погуглил и наткнулся на различные проблемы такого же рода, где люди говорили, что нужно убедиться, что файл .so действительно существует, а если его нет, то создать симлинк на файл с версией, например, zlib.so.1.2.8. Но когда я проверил, zlib.so существовал. Поэтому я подумал, что, конечно же, проблема не может быть в этом.
Я наткнулся на другой пост в Интернете, в котором предлагалось запустить make с LD_DEBUG=all:
Хотя я получил огромное количество отладочных данных, на самом деле это не помогло. Это добавило больше путаницы, чем чего-либо еще. Поэтому я уже собирался сдаться.
Затем я прозрел. Я решил проверить текст справки для команды ld:
Из него я понял, как запустить ld в режиме verbose (представьте себе):
Вот какой результат я получил:
Дзинь, дзинь, дзинь...
Итак, чтобы окончательно исправить это, я смог скомпилировать MySQL с моей собственной версией ZLIB (а не с поставляемой версией):
Вуаля!
Если имя вашей библиотеки, скажем,
libxyz.so
и она расположена по пути, скажем:то чтобы связать ее с вашей программой:
Там не представляется какой-либо ответ, который затрагивает очень распространенная проблема новичка не в состоянии установить необходимые библиотеки в первую очередь.
На Debianish платформ, если
libfoo
отсутствует, вы можете часто установить его с чем-то подобнымВ
-dev версию
пакета необходимых для разработки, даже тривиальный разработках, таких как компиляция исходного кода в ссылку в библиотеку.Имя пакета иногда требуют некоторые украшения (
libfoo0-Дев
?фу-дев
без префиксалиберал
? и т. д.), Или вы можете просто использовать ваш дистрибутив'ы пакет search, чтобы узнать точно, какие пакеты дают определенный файл.(Если есть больше чем один, вы должны выяснить, что их различия. Выбирая самые крутые или самые популярные-общепринятое сокращение, но не приемлемая процедура для любой серьезной работы развитию.)
Для других архитектур (особенно об / мин) аналогичные процедуры применяются, хотя детали будут разные.
Время Компиляции
Когда G++ говорит
не могу найти -л<nameOfTheLibrary>
, это означает, что G++ искали файлЛиб{nameOfTheLibrary}.так, но он не мог'т найти его в общий путь поиска библиотеки, которая по умолчанию указывает на
/УСР/Либ " и " /usr/местные/библиотека и где-то еще может быть.Для решения этой проблемы, вы должны либо предоставить файл библиотека (
Либ{nameOfTheLibrary}.так
) в этих путей поиска или использовать опцию-L команды. -Л{путь}
говорит г++ (на самом делеЛД
), чтобы найти файлы библиотеки в путь{путь}
в дополнение к пути по умолчанию.Пример: если у вас есть библиотека `/главная/Тейлор/libswift.Итак, и вы хотите связать свое приложение с этой библиотекой. В этом случае вы должны поставить г++ со следующими параметрами:
Примечание 1:
-л
вариант получает название Библиотека безлиберал
и `.так на ее начало и конец.Примечание 2: в некоторых случаях, в библиотеке имени файла с последующим его версии, для libswift экземпляр
.так.1.2
. В этих случаях г++ также не может найти файл библиотеки. Простое решение, чтобы исправить это создает символическую ссылку наlibswift.так.1.2 "под названием" libswift.так
.# Выполнения#
Когда вы ссылку на ваше приложение в общей библиотеке, Это's требовало, что библиотека остается доступен всякий раз, когда вы запустите приложение. Во время выполнения вашего приложения (на самом деле динамический компоновщик) ищет библиотеки в переменной LD_LIBRARY_PATH`. Это's в среду переменная, которая хранит список путей.
Пример: в случае libswift наши
.так, например, динамический компоновщик не может найти libswift.так в переменной LD_LIBRARY_PATH
(что указывает на пути поиска по умолчанию). Чтобы исправить проблему, вы должны добавить эту переменную с libswift путь`.так это в.При компиляции с G++ и
через
принятьопределение
library_path указано, если это не возможно, чтобы изменить Makefile с-Л'option. Я положил мои дополнительные библиотеки в папку/opt/Либ-так я и сделал:а потом побежал делать для успешной компиляции и линковки.
Для запуска программы с общей библиотекой, определить:
перед выполнением программы.
Во-первых, вы должны знать правила именования
ограничения имеются для распространения информации
:ЛНР
означаетбиблиотеки libc.так
,lltdl
означаетlibltdl.так
,lXtst
означаетlibXts.так
.Таким образом, это
либерал
+имя lib
+ `.такКак только мы знаем имя, мы можем использовать
найти
, чтобы найти путь из этого ограничения имеются для распространения информации.так файл`.Когда вы компилируете свою программу, вы должны указать путь к библиотеке; в g++ используйте опцию -L:
Проверьте расположение вашей библиотеки, например ограничения имеются для распространения информации.так:
Если его нет в
каталоге/usr/lib в папку
, типа этого:Сделано.
Эта ошибка может также быть достигнуто, если символическая ссылка является динамической библиотекой .так, но для устаревших причинам `-статический появляется среди флагов ссылке. Если да, попробуйте удалить его.
Кроме ответы уже даны, он также может быть дело в том, что .так что файл существует, но не назвал правильно. Или это может быть так, что .так что файл существует, но он принадлежит другому пользователю / корень.
Вопрос 1: неправильное название
Если вы связываете файл
-л<nameOfLibrary>
затем библиотека имени файла должно быть в формате ЛибЕсли у вас есть только
.так что файл, переименовать его!Вопрос 2: Неправильная хозяйка
Чтобы убедиться, что это не проблема - сделаем
Если файл принадлежит пользователю root или другим пользователем, вам нужно сделать
Я пытался перейти по ссылке, как оказалось, имеет нестандартное имя (т. е. не'т с префиксом 'Либ'), поэтому их рекомендуется использовать эту команду, чтобы скомпилировать его -
тест ССЗ.с-включите Либ/cspice.а-лм`
Вот информация с Ubuntu на моем ноутбуке.
Я использую найти, чтобы найти .так файлы для boost_filesystem и boost_system
Тогда ссылку .так что файлы в /usr/lib и переименовать .так
Молодец! Velocyto пакета R.Р был успешно установлен!