I'm mencoba untuk mengkompilasi program saya dan itu kembali kesalahan ini :
usr/bin/ld: cannot find -l<nameOfTheLibrary>
saya makefile saya menggunakan perintah g++
dan link ke perpustakaan saya yang merupakan link simbolik ke perpustakaan yang terletak pada direktori lain.
Ada pilihan untuk menambahkan untuk membuat ini bekerja silahkan?
Untuk mencari tahu apa yang linker mencari, jalankan dalam mode verbose.
Misalnya, saya mengalami masalah ini ketika mencoba untuk mengkompilasi MySQL dengan ZLIB dukungan. Saya menerima pesan kesalahan seperti ini saat kompilasi:
/usr/bin/ld: cannot find -lzlib
Saya melakukan beberapa Googl'ing dan terus datang di isu-isu yang berbeda dari jenis yang sama di mana orang-orang akan mengatakan untuk memastikan
Saya datang di lain posting di Internet yang menyarankan untuk menjalankan membuat dengan LD_DEBUG=semua:
LD_DEBUG=all make
Meskipun aku punya satu TON debugging output, itu bukan't benar-benar membantu. Ia menambahkan kebingungan lebih dari apa pun. Jadi, aku akan menyerah.
Kemudian, saya mendapat sebuah pencerahan. Saya pikir untuk benar-benar memeriksa teks bantuan untuk ld perintah:
ld --help
Dari itu, saya tahu bagaimana untuk menjalankan ld dalam mode verbose (bayangkan):
ld -lzlib --verbose
Ini adalah output yang saya punya:
==================================================
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...
Jadi, untuk akhirnya memperbaiki kesalahan itu agar saya bisa menyusun MySQL dengan versi saya sendiri dari ZLIB (daripada versi paket):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
Voila!
Jika nama perpustakaan anda adalah mengatakan libxyz.jadi
dan terletak di jalan mengatakan:
/home/user/myDir
kemudian untuk link ke program anda:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Ada tampaknya tidak akan ada jawaban yang alamat yang sangat umum pemula masalah gagal untuk menginstal perpustakaan diperlukan di tempat pertama.
Pada Debianish platform, jika libfoo
hilang, anda sering dapat menginstalnya dengan sesuatu seperti
apt-get install libfoo-dev
The -dev
versi dari paket yang diperlukan untuk pekerjaan pembangunan, bahkan sepele pekerjaan pembangunan seperti kompilasi kode sumber untuk link ke perpustakaan.
Nama paket akan kadang-kadang memerlukan beberapa dekorasi (libfoo0-dev
? foo-dev
tanpa lib
awalan? dll), atau anda hanya dapat menggunakan distro's paket search untuk mengetahui dengan tepat paket yang menyediakan file tertentu.
(Jika ada lebih dari satu, anda akan perlu untuk mengetahui apa perbedaan mereka. Memilih yang paling keren atau yang paling populer adalah umum shortcut, tapi bukan merupakan prosedur yang dapat diterima untuk setiap pekerjaan pembangunan serius.)
Untuk arsitektur lain (terutama RPM) prosedur yang sama berlaku, meskipun rincian akan berbeda.
Ketika g++ mengatakan tidak dapat menemukan -l<nameOfTheLibrary>
, itu berarti bahwa g++ mencari file lib{nameOfTheLibrary}.jadi
, tapi itu tidak't menemukan itu di pustaka bersama mencari jalan, yang secara default poin untuk /usr/lib
dan /usr/local/lib
dan di tempat lain mungkin.
Untuk mengatasi masalah ini, anda harus menyediakan file library (lib{nameOfTheLibrary}.jadi
) dalam pencarian jalur atau gunakan -L
perintah pilihan. -L{path}
menceritakan g++ (benar-benar ld
) untuk menemukan perpustakaan file di jalan {path}
selain default path.
Contoh: dengan Asumsi anda memiliki perpustakaan di /home/taylor/libswift.jadi
, dan anda ingin menghubungkan aplikasi anda ke perpustakaan ini. Dalam hal ini anda harus menyediakan g++ dengan opsi-opsi berikut:
g++ main.cpp -o main -L/home/taylor -lswift
Catatan 1*: -l
option mendapat nama perpustakaan tanpa* lib
dan .jadi
di awal dan akhir.
Catatan 2: Dalam beberapa kasus, perpustakaan nama file diikuti oleh versi, misalnya libswift.jadi.1.2
. Dalam kasus ini, g++ juga tidak dapat menemukan file library. Solusi sederhana untuk memperbaiki hal ini adalah menciptakan link simbolik ke libswift.jadi.1.2
disebut libswift.jadi
.
Ketika anda menghubungkan aplikasi anda ke ruang perpustakaan, it's diperlukan bahwa perpustakaan tetap tersedia setiap kali anda menjalankan aplikasi. Dalam runtime aplikasi anda (benar-benar dynamic linker) terlihat untuk perpustakaan di LD_LIBRARY_PATH
. It's variabel lingkungan yang menyimpan daftar dari jalan.
Contoh: Dalam kasus kami libswift.jadi
contoh, dynamic linker tidak dapat menemukan libswift.begitu
dalam LD_LIBRARY_PATH
(yang menunjuk ke default pencarian jalan). Untuk memperbaiki masalah ini anda harus menambahkan bahwa variabel dengan jalan libswift.jadi
lebih dalam.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
Selama kompilasi dengan g++
melalui membuat
mendefinisikan LIBRARY_PATH
jika hal itu mungkin tidak tepat untuk mengubah Makefile dengan -L'option. Aku telah menempatkan saya ekstra perpustakaan di
/opt/lib` jadi yang saya lakukan:
$ export LIBRARY_PATH=/opt/lib/
dan kemudian berlari membuat
untuk sukses kompilasi dan linking.
Untuk menjalankan program dengan shared library menentukan:
$ export LD_LIBRARY_PATH=/opt/lib/
sebelum mengeksekusi program.
Pertama, anda perlu mengetahui aturan penamaan dari lxxx
:
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst
lc
berarti libc.jadi
, lltdl
berarti libltdl.jadi
, lXtst
berarti libXts.jadi
.
Jadi, ini adalah lib
+ lib-nama
+ .jadi
Setelah kita mengetahui nama, kita dapat menggunakan cari
untuk menemukan jalan ini lxxx.jadi
file.
$ 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
Jika anda tidak dapat menemukannya, anda perlu menginstalnya dengan yum
(saya menggunakan CentOS). Biasanya anda memiliki file ini, tapi tidak link ke tempat yang tepat.
Link ke tempat yang tepat, biasanya itu adalah /lib64
atau /usr/lib64
$ sudo ln-s /home/user/anaconda3/lib/libiconv.so /usr/lib64/
Selesai!
ref: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
Terlepas dari jawaban-jawaban yang sudah diberikan, itu juga mungkin terjadi bahwa .jadi file yang ada tetapi tidak bernama dengan benar. Atau mungkin kasus yang .jadi file yang ada tetapi dimiliki oleh user lain / root.
Masalah 1: tidak Tepat nama
Jika anda menghubungkan file sebagai -l<nameOfLibrary>
kemudian perpustakaan nama file HARUS dalam bentuk lib<nameOfLibrary>
Jika anda hanya memiliki <nameOfLibrary>.jadi
file, mengubah nama itu!
Masalah 2: Salah pemilik
Untuk memverifikasi bahwa ini bukan masalah - apakah
ls -l /path/to/.so/file
Jika file yang dimiliki oleh root atau user lain, yang perlu anda lakukan
sudo chown yourUserName:yourUserName /path/to/.so/file
Berikut ini adalah Ubuntu informasi dari laptop saya.
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic
Saya menggunakan mencari untuk menemukan .jadi file-file untuk boost_filesystem dan boost_system
locate libboost_filesystem
locate libboost_system
Kemudian link .jadi file ke /usr/lib dan rename ke .jadi
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
Selesai! R paket velocyto.R berhasil diinstal!