usr / bin / ld: -l <nameOfTheLibrary> bulunamıyor


443

Programımı derlemeye çalışıyorum ve bu hatayı döndürüyor:

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

makefile komutumu kullanıyorum g++ve başka bir dizinde bulunan kütüphaneme sembolik bir bağlantı olan kütüphaneme bağlantıyı kullanıyorum.

Çalıştırmak için eklemek için bir seçenek var mı?


1
Daha fazla bilgiye ihtiyacınız var. Programınızı derlemek için hangi komutu verdiniz? Sen kullanabilirsiniz your-hedefin -n markasını sadece çağırmak normalde it would komutları yazdırmak marka olması
DJF

Yaptığınız makefile veya komutu kaydedin.
Ortwin Angermeier

Komuta bu biridir: g ++ - <seçenekler> objetc1.o objetc2.o objetc3.o objetc4.o -L <pathOfTheLibrary> -l <nameOfTheLibrary> -lpthread -o myexe
ZoOo

4
Bağlanmak istediğiniz kütüphane aynı mimari ile oluşturulmuş mu (örn. 32/64 bit)? Özel bir kütüphaneye bağlamak istediğiniz kütüphane mi? -lAnahtar kullanıldığında kütüphane adı önemlidir, çünkü anahtarı kullanırken lib <name> ile başlamalıdır (örneğin, zaten bağlantı kurduğunuz libpthread.so).
Ortwin Angermeier

1
Sorun kütüphanedeki sembolik bağımdaki iyi değildi! Yardımın için teşekkürler !
ZoOo

Yanıtlar:


196

Kütüphane adınız söylendiyse libxyz.sove yoldaysa:

/home/user/myDir

ardından programınıza bağlamak için:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog

11
kütüphanem dinamik bir (.so) değil, statik bir (.a). Sorun bundan mı kaynaklanıyor?
ZoOo

3
@ZoOo, normalde önemli olmamalı, bağlayıcı her
ikisiyle

7
Kütüphanenizi bağlamak için başka bir yol doğrudan .. /path/mylib.a ++ g gibi, tam yoluyla kütüphanenin adını belirtebilmenizdir
Saurabh Bhola

2
Evet ama hala çalışmıyor. Kütüphanem sembolik bir link, diğer kütüphanede kütüphaneyi kullandığımda işe yaradığı için sorunun bundan kaynaklandığını düşünüyorum!
ZoOo

2
Sembolik bağlantınız gerçek konumdaki kütüphaneye doğru işaret ediyor mu ??. "ll" çıkışını sembolik linke gönderebilir misiniz?
Saurabh Bhola

451

Bağlayıcının ne aradığını bulmak için onu ayrıntılı modda çalıştırın.

Örneğin, MySQL'i ZLIB desteği ile derlemeye çalışırken bu sorunla karşılaştım. Derleme sırasında böyle bir hata alıyordum:

/usr/bin/ld: cannot find -lzlib

Bazı Googl'ing yaptım ve insanların .so dosyasının gerçekten var olduğundan emin olmak için söyleyecekleri aynı türden farklı sorunlarla karşılaşmaya devam ettim ve eğer değilse, sürüm dosyası için bir sembolik bağlantı oluşturun, örneğin, zlib. so.1.2.8. Ama, kontrol ettiğimde, zlib var. Kesinlikle sorun olamayacağını düşündüm.

Internets LD_DEBUG = all ile yapmak önerilen önerilen başka bir yazı geldi:

LD_DEBUG=all make

Ben bir hata ayıklama çıktı bir ton var, ama aslında yardımcı olmadı. Her şeyden daha fazla karışıklık ekledi. Yani, pes etmek üzereydim.

Sonra bir epifan vardı. Aslında ld komutu için yardım metnini kontrol etmeyi düşündüm:

ld --help

Bundan, ld modda nasıl çalıştırılacağını anladım (bunu hayal et):

ld -lzlib --verbose

Bu aldığım çıktı:

==================================================
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

Ding Ding Ding...

Yani, sonunda düzeltmek için kendi ZLIB (paketlenmiş sürümü yerine) kendi sürümüm ile MySQL derlemek olabilir:

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

İşte bu kadar!


60
Teşekkürler, bu yardımcı oldu. Programlarını derlemek ve bağlamak için gcc kullanan diğer kullanıcılar için (doğrudan ld kullanmak yerine), -Xlinker --verbosebu seçeneği ld'ye geçirmek için gcc'nin komut satırı bağımsız değişkenlerine ekleyebilirsiniz .

5
Bu da bana yardımcı oldu. Sahip olduğum Makefile sadece statik kütüphaneler kullanıyordu -Wl,-Bstatic. Bu, aramayı yalnızca .a dosyalarıyla sınırlar. Ayrıntılı seçenek bunu açıkça gösterdi. Ben kaldırıldıktan sonra -Wl,-Bstaticpaylaşılan kütüphaneler de arandı.
micah94

2
FreeBSD 10'dayım. Yeni LLVM Clang cc formun bir argümanını alır ve linkere -Wl,--verbosegeçer --verbose.
Christian Campbell

7
İşte buna mükemmel cevap diyorum! Çok teşekkürler. Çok zaman kazandı. Sadece benim gibi birine yardım etmek için. Yolla ilgili sorunlarda hata ayıklamak için de kullanılabilir. Yolu -L <dizin yolu>> komutuyla, ld -L <yol> -l <kütüphane adı> --verbose
sbhatt

2
Bu bak @EdwardBlack cevabı . Aslında, gcc -Wl,--verboseiçin, bağlayıcıya ayrıntılı geçmek için ekleyin .
chembrad

46

Başlangıçta gerekli kütüphaneyi kuramamanın en yaygın başlangıç ​​problemini ele alan herhangi bir cevap yok gibi görünüyor.

Debianish platformlarında, libfooeksikse, sık sık aşağıdaki gibi bir şeyle yükleyebilirsiniz

apt-get install libfoo-dev

-devPaketin versiyonu böyle kütüphanesine bağlantı kaynak kodunu derlemek olarak, geliştirme çalışmaları için bile önemsiz geliştirme çalışmaları gereklidir.

Paket adı bazen bazı süslemeler ( libfoo0-dev? Öneki foo-devolmadan lib? Vb.) Gerektirir veya belirli bir dosyayı tam olarak hangi paketlerin sağladığını bulmak için dağıtımınızın paket aramasını kullanabilirsiniz.

(Birden fazla varsa, farklılıklarının ne olduğunu bulmanız gerekecektir. En havalı veya en popüler olanı seçmek ortak bir kısayoldur, ancak herhangi bir ciddi geliştirme çalışması için kabul edilebilir bir prosedür değildir.)

Diğer mimariler için (en önemlisi RPM), ayrıntılar farklı olsa da benzer prosedürler geçerlidir.


3
Bu sadece taze bir sunucu ve Perl ile ilgili bir sorun bana yardımcı oldu. apt-get install libperl-devbenim için sıraladı. Teşekkürler :)
Andrew Newby

1
Bu! Makefile ile uğraşmaya gerek yok
Byron Whitlock

Bu muhtemelen en yaygın çözümdür ve CentOS 7'de kaktüs omurgasını derlememe yardımcı oldu yum install openssl-devel.
djluko

1
.So ile biten symlink'i bulursanız en iyi çözüm budur, ancak symlink'i yapmak yerine libfoo.so.6 -> libfoo.so.6.0.2 (örneğin) gibi bir symlinkiniz var. el. (libfoo paketinin kurulu olduğu, ancak libfoo-
dev'in

39

Derleme zamanı

G ++ derken cannot find -l<nameOfTheLibrary>, g ++ dosyasının lib{nameOfTheLibrary}.soaradığı anlamına gelir , ancak varsayılan olarak /usr/libve /usr/local/libbaşka bir yere işaret eden paylaşılan kitaplık arama yolunda bulamadı .

Bu sorunu gidermek için, lib{nameOfTheLibrary}.sobu arama yollarında kitaplık dosyasını ( ) sağlamalı veya -Lkomut seçeneğini kullanmalısınız . -L{path}g ++ 'ya (aslında ld) {path}varsayılan yollara ek olarak yoldaki kütüphane dosyalarını bulmasını söyler .

Örnek: adresinde bir kitaplığınız olduğunu /home/taylor/libswift.sove uygulamanızı bu kitaplığa bağlamak istediğinizi varsayalım. Bu durumda, g ++ 'yı aşağıdaki seçeneklerle sağlamanız gerekir:

g++ main.cpp -o main -L/home/taylor -lswift
  • Not 1 : -lseçenek kitaplık adını alır olmadan lib ve .soonun başında ve sonunda.

  • Not 2 : Bazı durumlarda, örneğin kütüphane dosya adının ardından sürümü gelir libswift.so.1.2. Bu durumlarda, g ++ kitaplık dosyasını da bulamaz. Bunu düzeltmek için basit bir çözüm libswift.so.1.2çağrılan için sembolik bir bağlantı oluşturmaktır libswift.so.


Çalışma süresi

Uygulamanızı paylaşılan bir kitaplığa bağladığınızda, uygulamayı her çalıştırdığınızda kitaplığın kullanılabilir kalması gerekir. Çalışma zamanında uygulamanız (aslında dinamik bağlayıcı) içindeki kitaplıklarını arar LD_LIBRARY_PATH. Yolların bir listesini saklayan bir ortam değişkeni.

Örnek: Bizim durumunda libswift.soörneğin, dinamik bağlayıcı bulamıyorum libswift.soiçinde LD_LIBRARY_PATH(varsayılan arama yollarına hangi puan). Sorunu çözmek için bu değişkenin yolunu eklemeniz gerekir libswift.so.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor

Gönderiniz için teşekkürler! .soDosyaları kopyaladığım ana kadar tüm cevapları görmezden geldim /usr/lib, ama exportyardımcı olup olmayacağı benim için ilginç oldu . Daha makeuzun süre devam ettikten sonra kurulum işlemine rağmen başka bir hata oluştu. Bu kez, .so.0dosya bulunamadı, ancak hem .sove .so.0dosya kaynağından bağımlı paket oluşturmak nerede dizinde idi. Bu konuda yardımcı olabilir misiniz?
A.Ametov

33

İle derleme sırasında g++aracılığıyla maketanımlamak LIBRARY_PATHonunla Makefile değiştirmeye uygun olmayabilir eğer -Lseçeneği. Ek kütüphanemi yerleştirmiştim, /opt/libbu yüzden yaptım:

$ export LIBRARY_PATH=/opt/lib/

ve sonra makebaşarılı derleme ve bağlantı için koştu .

Programı paylaşılan bir kütüphane ile çalıştırmak için şunları tanımlayın:

$ export LD_LIBRARY_PATH=/opt/lib/

programı yürütmeden önce.


14

İlk olarak, adlandırma kuralını bilmeniz gerekir lxxx:

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

lcaracı libc.so, lltdlaraçlar libltdl.so, lXtstaraçlar libXts.so.

Yani, lib+ lib-name+.so


Adı öğrendikten sonra locate, bu lxxx.sodosyanın yolunu bulmak için kullanabiliriz .

$ 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

yumBulamazsanız , (CentOS kullanıyorum) tarafından yüklemeniz gerekir . Genellikle bu dosyanız vardır, ancak doğru yere bağlantı oluşturmaz.


Doğru yere bağlayın, genellikle /lib64veya/usr/lib64

$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/

Bitti!

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


4
locateyalnızca düzenli olarak kurulup çalışıyorsa çalışır. Kaba bir çözüm findtüm diskinizde çalıştırmaktır , ancak elbette, zaman alacaktır. Kendinizi bunu sık sık yapıyorsanız locate, bu işlemin (etkileşimli, insan) maliyetini düşürmek için yüklemeyi düşünün .
tripleee

5

Programınızı derlerken kütüphaneye giden yolu sağlamalısınız; g ++ 'da -L seçeneğini kullanın:

g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar

1
Biz değişim gerekiyor hangi özellik ccmakeböylece Makefilebağlantılı bayrağıyla oluşturulur? -lARToolkitPlusBayrağımı bir yola bağlamak istiyorum .
Shashwat

2

Bu hata, sembolik bağ .so olarak dinamik bir kitaplığa ise, ancak eski nedenlerle -staticbağlantı bayrakları arasında görünüyorsa da ortaya çıkabilir . Öyleyse, kaldırmayı deneyin.


2

Kütüphanenizin yerini kontrol edin, örneğin lxxx.so:

locate lxxx.so

/usr/libKlasörde değilse , şunu yazın:

sudo cp yourpath/lxxx.so /usr/lib

Bitti.


4
Kitaplıkları sistem dizinlerine kopyalarken dikkatli olmanız gerekir.
Paul Floyd

2

Daha önce verilen yanıtların yanı sıra, * .so dosyasının var olduğu, ancak düzgün adlandırılmadığı da olabilir. Veya * .so dosyası var olabilir, ancak başka bir kullanıcı / köke aittir.

Sorun 1: Hatalı ad

Dosyayı bu şekilde bağlıyorsanız, -l<nameOfLibrary> kütüphane dosya adı formda olmalıdır ZORUNLU lib<nameOfLibrary> Sadece <nameOfLibrary>.sodosyanız varsa yeniden adlandırın!

Sorun 2: Yanlış sahip

Bunun sorun olmadığını doğrulamak için -

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

Dosya kök veya başka bir kullanıcıya aitse,

sudo chown yourUserName:yourUserName /path/to/.so/file

1

Bağlanmaya çalıştığım kütüphane standart olmayan bir isme sahip olduğu ortaya çıktı (yani 'lib' ile önek eklenmedi), bu yüzden derlemek için böyle bir komut kullanmanızı tavsiye ettiler -

gcc test.c -Iinclude lib/cspice.a -lm


Sadece standart bir isim almak için "lib" ile önek benim için düzeltti
el_technic0

1

İşte dizüstü bilgisayarımın Ubuntu bilgileri.

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

Boost_filesystem ve boost_system için .so dosyalarını bulmak için locate kullanıyorum

locate libboost_filesystem
locate libboost_system

Sonra .so dosyalarını / usr / lib'e bağlayın ve .so olarak yeniden adlandırın.

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

Bitti! R paketi velocyto.R başarıyla kuruldu!


1

Aynı hata mesajıyla karşılaştım.

Ben inşa cmockabir şekilde sove benim yürütülebilir bağlamak için çalıştı. Ancak ldher zaman aşağıda şikayet eder:

/ usr / bin / ld: -lcmocka bulunamıyor

Oluşturulduktan sonra oluşturulan 3 dosya olduğu ortaya çıkıyor cmocka:

  1. libcmocka.so
  2. libcmocka.so.0
  3. libcmocka.so.0.7.0

1 ve 2 sembol bağlantılarıdır ve sadece 3 gerçek dosyadır.

Sadece 1'i kütüphane klasörüne kopyaladım, burada ld3'ü bulamadım.

Ben tüm 3 kopyaladıktan sonra ldçalışır.


Lütfen "kütüphane klasörüm" altında hangi klasörü kastettiğinizi söyleyebilir misiniz?
A.Ametov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.