USR/бен/л.д .: ня можа знайсьці -l <nameOfTheLibrary>

Я спрабую скампіляваць сваю праграму, і яна вяртае гэтую памылку:

usr/bin/ld: cannot find -l

у маёй Makefile я выкарыстоўваю каманду г ++ і спасылку на сваю бібліятэку, якая з'яўляецца сімвалічнай спасылкай на маю бібліятэку, размешчанай на іншым каталогу.

Ці ёсць магчымасць дадаць, каб зрабіць яго працу, калі ласка?

288
Як кажуць у адказ ніжэй вырашыў ур пытанне, таму прыняць гэты адказ.
дададзена аўтар goldenmean, крыніца
Паведамленне зборачнай файла або каманды, якую выканаць.
дададзена аўтар Ortwin Angermeier, крыніца
Ці з'яўляецца бібліятэка вы хочаце звязаць з убудаваным з той жа архітэктурай (напрыклад. 32/64 біт)? Ці з'яўляецца бібліятэка вы хочаце звязаць з карыстацкай бібліятэкай? Пытанні, імя бібліятэкі, так як ён павінен пачаць з Lib <�імя> пры выкарыстанні -l перамыкач (напрыклад. Libpthread.so вы ўжо сувязь с).
дададзена аўтар Ortwin Angermeier, крыніца
Вам трэба больш інфармацыі. Якую каманду вы Выдаць скампіляваць праграму? Вы можаце выкарыстоўваць <�я> зрабіць -n свой-мішэнь , каб зрабіць толькі надрукаваць каманды было б нармальна выклікаць
дададзена аўтар djf, крыніца
толькі другі @OrtwinAngermeier каментар аб бібліятэцы наймення: stackoverflow.com/questions/6561273/…
дададзена аўтар jotadepicas, крыніца
Гатова! ;) Дзякуй.
дададзена аўтар ZoOo, крыніца
Праблема была ў маёй сімвалічнай спасылкі на бібліятэку, якая не была добрая! Дзякуй за вашу дапамогу !
дададзена аўтар ZoOo, крыніца
мая каманда гэта адзін: г ++ - <�опцыі> objetc1.o objetc2.o objetc3.o objetc4.o -L -l -lpthread -o myexe
дададзена аўтар ZoOo, крыніца
У Debian/Ubuntu Linux паспрабаваць трапны пошук <�я> nameoflib </я> так што вы атрымаеце дакладную назву таго, што вы хочаце ўсталяваць
дададзена аўтар Allan Karlson, крыніца

11 адказы

Для таго, каб высветліць, што кампаноўнік шукае, запусціць яго ў пашыраным рэжыме.

Напрыклад, я сутыкнуўся з гэтай праблемай пры спробе кампіляцыі MySQL з падтрымкай ZLIB. Я атрымліваю паведамленне пра памылку, як гэта падчас кампіляцыі:

/usr/bin/ld: cannot find -lzlib

Я зрабіў некаторыя Googl'ing і працягвалі паступаць па розных пытаннях, аднаго і таго ж роду, дзе людзі маглі б сказаць, каб пераканацца, што .so файл на самай справе існуе, і калі гэта не адбудзецца, а затым стварыць сімвалічную спасылку на файл версированной, напрыклад, Zlib. so.1.2.8. Але, калі я праверыў, zlib.so DID існуе. Так, я думаў, вядома, што не можа быць праблемай.

Я наткнуўся на іншую пасаду на інтэрнэт, што прапанаваў запусціць зрабіць з LD_DEBUG = ўсё:

LD_DEBUG=all make

Хоць я атрымаў тону адладкавыя выснову, што не было на самай справе карысна. Яна дадала больш блытаніны, чым усе астатняе. Так, я збіраўся здавацца.

Тады ў мяне было прасвятленне. Я думаў, што на самой справе праверыць тэкст даведкі для каманды LD:

ld --help

З гэтага я зразумеў, як запусціць ЛД ў пашыраным рэжыме (уявіце, што):

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

Вуаля!

329
дададзена
Як наладзіць зрабіць , так што ён будзе шматслоўным?
дададзена аўтар Black, крыніца
Гэты наканечнік Л.Д. lzlib --verbose гэта так карысна. Я зразумеў праблему таямніцы, пачынаючы з ўдару па выхаду гэтай каманды. На самай справе некаторыя Lib * .so фактычна спасылка сцэнар і праінструктаваць, як звязаць агульную бібліятэку для выкарыстання.
дададзена аўтар NathaneilCapital, крыніца
Я таксама атрымаў той жа вынік для #ld -lzlib --verbose -> спроба адкрыць /usr/x86_64-linux-gnu/lib64/libzlib.so няўдалую спробу адкрыць/USR/x86_64-Лінуксам гну/lib64/libzlib. няўдалая спроба адкрыць //usr/local/lib/x86_64-linux-gnu/libzlib.so няўдалую спробу адкрыць //usr/local/lib/x86_64-linux-gnu/libzlib.a не ўдалося
дададзена аўтар Ashish Karpe, крыніца
але «судо зав -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so» гэта не працуе для мяне
дададзена аўтар Ashish Karpe, крыніца
@dcarrith я не знайшоў гэтую /usr/lib/libz.so.1.2.8
дададзена аўтар Hana90, крыніца
Я на FreeBSD 10. Новы LLVM Clang куб.см прымае аргумент кшталту -Wl, - шматслоўна і перадае - шматслоўны линкера.
дададзена аўтар Christian Campbell, крыніца
Я ніколі не разумеў, як бібліятэка знаходкай працавала на працягу доўгага часу. Гэта нарэшце-то адказаў. Дзякуй.
дададзена аўтар Tek, крыніца
Гэта павінна быць прынята адказ!
дададзена аўтар Roman, крыніца
См адказ ніжэй stackoverflow.com/a/42339395/332359 лепшага спосабу, чым робячы спасылку самастойна.
дададзена аўтар dmaestro12, крыніца
Гэта было вельмі карысна. Ці можаце вы сказаць мне, як мы можам змяніць шлях для канкрэтнага сцяга ў Л.Д. ?
дададзена аўтар Shashwat, крыніца
Дзякуй, гэта было карысна. Для іншых, выкарыстоўваючы GCC для кампіляцыі і звязаць сваю праграму (а не з дапамогай ЛД наўпрост), вы можаце дадаць -Xlinker --verbose аргументы каманднага радка GCC, каб мець яго, гэтую опцыю л.д ..
дададзена аўтар Simon South, крыніца
Выдатна! Я быў гультаяваты і пабег мой тэст у Cygwin замест Ubuntu VM. Аказваецца, я стрэліў сабе ў нагу. Як ражок для абутку для Windows, які стварае A.exe замест a.out, Cygwin таксама чакае libxyz.dll, НЕ libxyz.so! Гэта зрабіла для мяне ясна. Дзякуй!
дададзена аўтар Jerry Miller, крыніца
Наканечнік аб выкарыстанні LD Имя_библиотеки --verbose было вельмі карысна. У маім выпадку, Л.Д. чакаў .so, але ў мяне была толькі .so.1.
дададзена аўтар Diogo Melo, крыніца
Дзякуй за адказ. Але ці ёсць спосаб, каб вырашыць яе, калі ў мяне няма дазволу на стварэнне сімвалічнай спасылкі?
дададзена аўтар Sidak, крыніца
Вялікі адказ. Гэта прывяло мяне да гэтай праблемы для мяне: спакаваныя ЛИЭС мелі няправільныя дазволу пасля размяшчэння іх у/USR/мясцовыя/Бібліятэка каталога. Я толькі што ўвялі: CHMOD 755 і мой крыніца скампіляваны.
дададзена аўтар chembrad, крыніца
@EdwardBlack Глядзіце гэтую адказаць . Па-сутнасьці, для GCC, проста дадайце -Wl, - шматслоўны , каб перадаць шматслоўны линкер.
дададзена аўтар chembrad, крыніца
Гэта таксама дапамагло мне. Makefile я меў толькі чакаючы статычных бібліятэк, так што выкарыстоўваецца -Wl, -Bstatic . Гэта абмяжоўвае пошук толькі .a файлы. Шматслоўны варыянт паказаў гэта ясна. Пасля таго, як я выдаліў -Wl, -Bstatic падзяляем бібліятэкі былі таксама знойдзеныя.
дададзена аўтар micah94, крыніца
Ubuntu 16.10: судо зав -s /usr/local/lib/libz.so.1.2.10 /usr/lib/libzlib.so
дададзена аўтар ilyasavitski, крыніца
Цяпер вось што я называю ідэальны адказ! Вялікі дзякуй. Гэта выратавала шмат часу. Проста дадаць, каб дапамагчы каму-то, як я. Ён можа быць выкарыстаны для адладкі праблем, звязаных шляху, а таксама. Пераканайцеся, што вы праверыць шлях з -L <�шлях да каталога> з камандай, Л.Д. -L <�шлях> -l <�імя бібліятэкі> --verbose
дададзена аўтар sbhatt, крыніца
Яшчэ адзін плюс для вялікага адказу. Я таксама сутыкнуўся з той жа праблемай ( «спроба адкрыць libc.a не ўдалося»), але ў маім выпадку гэта проста апынулася, што апошні параметр радок, якая была перададзена ld.exe апынулася даўжынёй больш 8300 сімвалаў (прыблізнае лік) , Пасля стварэння шляху ToolChain карацей праблема знікла.
дададзена аўтар yurko, крыніца
працаваў Cgwin.
дададзена аўтар AlexWei, крыніца

Калі ваша бібліятэка імя сказаць libxyz.so , і ён знаходзіцца на шляху кажуць:

/home/user/myDir

затым звязаць яго з вашай праграмай:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
127
дададзена
Вам трэба пакласці -lxyz <�я> пасля </я> myprog.cpp з линкера будзе вырашыць толькі знакі для аб'ектных файлаў у левай у камандным радку.
дададзена аўтар wcochran, крыніца
@ZoOo, што звычайна не павінны значэння, линкер можа працаваць альбо з адным
дададзена аўтар djf, крыніца
Як дадаць спасылку на касметычны файл?
дададзена аўтар Naveen, крыніца
@ZoOo: рады, што працаваў :)
дададзена аўтар Saurabh Bhola, крыніца
іншы спосаб звязаць сваю бібліятэку, што вы можаце непасрэдна паказаць імя бібліятэкі з указаннем поўнага шляху, як г ++ .. /path/mylib.a
дададзена аўтар Saurabh Bhola, крыніца
Ваша сімвалічная спасылка правільна паказвае на бібліятэцы фактычнага месцазнаходжання ??. Вы можаце размясціць выхад «LL» на сімвалічную спасылку.
дададзена аўтар Saurabh Bhola, крыніца
мая бібліятэка не з'яўляецца дынамічным адзін (.so), але статычны адзін (.a). Ці ўключаецца праблема з гэтым?
дададзена аўтар ZoOo, крыніца
Так, але ён па-ранейшаму не працуе. Мая бібліятэка з'яўляецца сімвалічнай спасылкай, я думаю, што праблема прыходзіць ад таго, што калі я выкарыстаць бібліятэку ў іншым каталогу, гэта працуе!
дададзена аўтар ZoOo, крыніца
Я таксама непасрэдна імя бібліятэкі і ён не працуе!
дададзена аўтар ZoOo, крыніца
Ты маеш рацыю ! Дзякуй за вашу дапамогу @SaurabhBhola маёй знакавая спасылкі на бібліятэцы ў іншым каталогу не было добра! Я гэта выправіць, і цяпер ён працуе !!! Дзякуй усім вам!
дададзена аўтар ZoOo, крыніца

Падчас кампіляцыі з г ++ праз зрабіць вызначыць library_path , калі ён не можа быць мэтазгодна змяніць Makefile з -L варыянт. Я кладу дадатковую бібліятэку /Opt/Lib , так што я зрабіў:

$ export LIBRARY_PATH=/opt/lib/

а затым пабег зрабіць для паспяховай кампіляцыі і кампаноўкі.

Для запуску праграмы з падзялянай бібліятэкай вызначае:

$ export LD_LIBRARY_PATH=/opt/lib/

перад выкананнем праграмы.

23
дададзена

Там, здаецца, не будзе які-небудзь адказ, які вырашае вельмі распаўсюджаную пачаткоўцу праблему не ў стане ўсталяваць неабходную бібліятэку ў першую чаргу.

На Debianish платформах, калі libfoo адсутнічае, вы можаце часта ўсталяваць яго з чымсьці накшталт

apt-get install libfoo-dev

<�Код> -dev версіі пакета патрабуецца для працы ў галіне развіцця, нават трывіяльныя доследна-канструктарскія работы, такія як кампіляцыі зыходнага кода для спасылкі на бібліятэку.

The package name will sometimes require some decorations (libfoo0-dev? foo-dev without the lib prefix? etc), or you can simply use your distro's package search to find out precisely which packages provide a particular file.

(Калі ёсць больш чым адзін, вам трэба будзе высветліць, якія іх адрозненні. Выбар самой круты або найбольш папулярным з'яўляецца агульным ярлык, але не з'яўляецца прымальнай працэдурай для любой сур'ёзнай працы ў галіне развіцця.)

Для іншых архітэктур (перш за ўсё RPM) падобныя працэдуры прымяняюцца, хоць дэталі будуць адрознівацца.

20
дададзена
Гэта як раз дапамог мне з пытаннем, у мяне быў з новым серверам і Perl. <�Код> APT-атрымаць ўстаноўку libperl-DEV адсартаваны гэта для мяне. дзякуй :)
дададзена аўтар Andrew Newby, крыніца
Гэта лепшы выправіць, калі вы знойдзеце знакавую спасылку, якая сканчаецца ў .so адсутнічае, але ў вас ёсць сімвалічная спасылка, такія як libfoo.so.6 -> libfoo.so.6.0.2 (напрыклад), а не робячы спасылку на рука. (Гэта значыць, вы ўсталявалі пакет libfoo, але не libfoo-DEV)
дададзена аўтар dmaestro12, крыніца
Гэта! Няма неабходнасці важдацца з Makefile
дададзена аўтар Byron Whitlock, крыніца
Гэта, верагодна, найбольш распаўсюджаным рашэннем і дапамог мне сабраць кактусы-хрыбетніку на CentOS 7. Просты ням ўсталяваць OpenSSL-Devel вырашыў.
дададзена аўтар djluko, крыніца

Compile Time

When G++ says cannot find -l, it means that G++ looked for the file lib{nameOfTheLibrary}.so, but it couldn't find it in the shared library search path, which by default points to /usr/lib and /usr/local/lib and somewhere else maybe.

Каб вырашыць гэтую праблему, вы павінны альбо прадаставіць файл бібліятэкі ( Lib {nameOfTheLibrary} .so ) у гэтых шляхах пошуку або выкарыстоўвайце -L опцыі каманднага радка. <�Код> -L {шлях} кажа G ++ (на самай справе Л.Д. ), каб знайсці файлы бібліятэк у шляху {шлях} у дадатак да дэфолту шляху.

Example: Assuming you have a library at /home/taylor/libswift.so, and you want to link your app to this library. In this case you should supply the G++with the following options:

g++ main.cpp -o main -L/home/taylor -lswift
  • <�моцны> Заўвага 1 : -l опцыя атрымлівае імя бібліятэкі <�ет> без Lib і .so у яго пачатку і канцы.

  • <�моцны> Заўвага 2 : У некаторых выпадках імя файла бібліятэкі з наступным яго версіі, напрыклад libswift.so.1.2 . У гэтых выпадках, G ++ таксама не можа знайсці файл бібліятэкі. Простае рашэнне, каб выправіць гэта стварае сімвалічную спасылку libswift.so.1.2 называецца libswift.so .


час выканання

When you link your app to a shared library, it's required that library stays available whenever you run the app. In час выканання your app (actually dynamic linker) looks for its libraries in LD_LIBRARY_PATH. It's an environment variable which stores a list of paths.

Example: In case of our libswift.so example, dynamic linker cannot find libswift.so in LD_LIBRARY_PATH (which points to default search paths). To fix the problem you should append that variable with the path libswift.so is in.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
17
дададзена

Пры кампіляцыі праграмы вы павінны паказаць шлях да бібліятэкі; у г ++ выкарыстоўваць опцыю -L:

g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
4
дададзена
Якое ўласцівасць мы павінны змяніць у ccmake , так што Makefile ствараецца са звязаным сцягам? Я хачу звязаць свой -lARToolkitPlus сцяг на шляху.
дададзена аўтар Shashwat, крыніца
дзякуй, я ўжо зрабіць гэта, але ён не працуе
дададзена аўтар ZoOo, крыніца

Па-першае, вы павінны ведаць правілы наймення LXXX :

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

lc means libc.so, lltdl means libltdl.so, lXtst means libXts.so.

So, it is lib + lib-name + .so


Пасля таго, як мы ведаем імя, мы можам выкарыстоўваць лакалізаваць , каб знайсці шлях да гэтага lxxx.so файла.

$ 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). Звычайна ў вас ёсць гэты файл, але не спасылаецца на патрэбнае месца.


Link it to the right place, usually it is /lib64 or /usr/lib64

<�Код> $ судо зав -s /home/user/anaconda3/lib/libiconv.so/USR/lib64/

Гатова!

ref: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html

2
дададзена
<�Код> знайсці працуе толькі пры ўсталёўцы і рэгулярна запускаючы яго. Сырой абыходны шлях, каб запусціць знайсці на ўвесь дыску, але, вядома, гэта зойме некаторы час. Калі вы знайшлі сябе рабіць гэта часта, разгледзіце магчымасць ўстаноўкі знайсці проста панізіць (інтэрактыўны, чалавека) кошт гэтай аперацыі.
дададзена аўтар tripleee, крыніца

Гэтая памылка таксама можа быць выклікана, калі сімвалічная спасылка на дынамічную бібліятэку, .so, але для старых прычын -static з'яўляецца сярод сцягоў спасылак. Калі так, то паспрабуйце выдаліць яго.

2
дададзена

Праверце размяшчэнне вашай бібліятэкі, напрыклад lxxx.so:

locate lxxx.so

Калі гэта не ў /USR/Бібліятэка папка, увядзіце наступнае:

sudo cp yourpath/lxxx.so /usr/lib

Гатова.

1
дададзена
Вы павінны праяўляць асцярожнасць пры капіяванні бібліятэк у сістэмныя каталогі.
дададзена аўтар Paul Floyd, крыніца

Акрамя адказаў ўжо дадзена, яно таксама можа быць так, што * .so файл існуе, але не названы правільна. Ці гэта можа быць так, што * .so файл існуе, але яно належыць іншаму карыстальніку/корань.

Issue 1: Improper name

If you are linking the file as -l then library file name MUST be of the form lib If you only have .so file, rename it!

Issue 2: Wrong owner

Для таго, каб пераканацца, што гэта не праблема - зрабіць

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

Калі файл належыць корань або іншага карыстальніка, вам трэба зрабіць

sudo chown yourUserName:yourUserName /path/to/.so/file
0
дададзена

Бібліятэка я спрабаваў звязаць з апынуліся мець нестандартнае імя (гэта значыць, не з прэфіксам «Lib»), таму яны рэкамендавалі выкарыстоўваць такую ​​каманду для кампіляцыі -

<�Код> НКУ test.c -Iinclude Бібліятэка/cspice.a -lm

0
дададзена