Saya mencoba mengkompilasi program saya dan mengembalikan kesalahan ini:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
di makefile saya, saya menggunakan perintah g++
dan tautan ke perpustakaan saya yang merupakan tautan simbolis ke perpustakaan saya yang terletak di direktori lain.
Apakah ada opsi untuk ditambahkan agar berhasil?
-l
sakelar (mis. Libpthread.so yang sudah Anda tautkan).Jawaban:
Jika nama perpustakaan Anda diucapkan
libxyz.so
dan terletak di jalur, katakan:lalu menautkannya ke program Anda:
sumber
Untuk mengetahui apa yang dicari oleh tautan, jalankan dalam mode verbose.
Misalnya, saya mengalami masalah ini ketika mencoba mengkompilasi MySQL dengan dukungan ZLIB. Saya menerima kesalahan seperti ini selama kompilasi:
Saya melakukan beberapa Googl'ing dan terus menemukan masalah yang berbeda dari jenis yang sama di mana orang akan mengatakan untuk memastikan file .so benar-benar ada dan jika tidak, kemudian buat symlink ke file versi, misalnya, zlib. jadi 1.2.2. Tapi, ketika saya periksa, zlib.so DID ada. Jadi, saya pikir, pasti itu bukan masalahnya.
Saya menemukan posting lain di Internet yang menyarankan untuk menjalankan make dengan LD_DEBUG = semua:
Meskipun saya mendapat TON hasil debugging, itu sebenarnya tidak membantu. Itu menambahkan lebih banyak kebingungan daripada yang lain. Jadi, saya hampir menyerah.
Kemudian, saya memiliki pencerahan. Saya pikir untuk benar-benar memeriksa teks bantuan untuk perintah ld:
Dari situ, saya menemukan cara menjalankan ld dalam mode verbose (bayangkan itu):
Ini adalah output yang saya dapatkan:
Ding, ding, ding ...
Jadi, untuk akhirnya memperbaikinya sehingga saya dapat mengkompilasi MySQL dengan versi ZLIB saya sendiri (bukan versi yang dibundel):
Voila!
sumber
-Xlinker --verbose
argumen baris perintah gcc agar meneruskan opsi ini ke ld.-Wl,-Bstatic
. Ini membatasi pencarian hanya untuk file .a Opsi verbose menunjukkan ini dengan jelas. Setelah saya menghapus-Wl,-Bstatic
perpustakaan bersama juga dicari.-Wl,--verbose
dan melewati--verbose
ke linker.-Wl,--verbose
pass verbose ke linker.Tampaknya tidak ada jawaban yang membahas masalah pemula yang sangat umum gagal menginstal perpustakaan yang diperlukan di tempat pertama.
Pada platform Debianish, jika
libfoo
tidak ada, Anda dapat sering menginstalnya dengan sesuatu sepertiItu
-dev
versi paket yang diperlukan untuk pekerjaan pembangunan, bahkan pekerjaan pembangunan sepele seperti kompilasi kode sumber untuk nge-link ke perpustakaan.Nama paket terkadang membutuhkan beberapa dekorasi (
libfoo0-dev
?foo-dev
Tanpalib
awalan? Dll), atau Anda dapat menggunakan pencarian paket distro Anda untuk mengetahui secara tepat paket mana yang menyediakan file tertentu.(Jika ada lebih dari satu, Anda perlu mencari tahu apa perbedaannya. Memilih yang paling keren atau paling populer adalah jalan pintas yang umum, tetapi bukan prosedur yang dapat diterima untuk setiap pekerjaan pengembangan yang serius.)
Untuk arsitektur lain (terutama RPM) prosedur serupa berlaku, meskipun detailnya akan berbeda.
sumber
apt-get install libperl-dev
mengurutkannya untukku. Terima kasih :)yum install openssl-devel
menyelesaikannya.Waktu kompilasi
Ketika g ++ mengatakan
cannot find -l<nameOfTheLibrary>
, itu berarti bahwa g ++ mencari filelib{nameOfTheLibrary}.so
, tetapi tidak dapat menemukannya di jalur pencarian perpustakaan bersama, yang secara default menunjuk ke/usr/lib
dan/usr/local/lib
dan di tempat lain mungkin.Untuk mengatasi masalah ini, Anda harus menyediakan file perpustakaan (
lib{nameOfTheLibrary}.so
) di jalur pencarian tersebut atau menggunakan-L
opsi perintah.-L{path}
memberitahu g ++ (sebenarnyald
) untuk menemukan file library di path{path}
selain path default.Contoh: Anggap Anda memiliki perpustakaan di
/home/taylor/libswift.so
, dan Anda ingin menautkan aplikasi Anda ke perpustakaan ini. Dalam hal ini, Anda harus menyediakan g ++ dengan opsi berikut:Catatan 1 :
-l
opsi mendapatkan nama pustaka tanpalib
dan.so
pada awal dan akhir.Catatan 2 : Dalam beberapa kasus, nama file perpustakaan diikuti oleh versinya, misalnya
libswift.so.1.2
. Dalam kasus ini, g ++ juga tidak dapat menemukan file perpustakaan. Solusi sederhana untuk memperbaikinya adalah membuat tautan simbolis untuklibswift.so.1.2
dipanggillibswift.so
.Runtime
Saat Anda menautkan aplikasi ke perpustakaan bersama, perpustakaan harus tetap tersedia setiap kali Anda menjalankan aplikasi. Di runtime aplikasi Anda (sebenarnya tautan dinamis) mencari pustaka di
LD_LIBRARY_PATH
. Ini adalah variabel lingkungan yang menyimpan daftar jalur.Contoh: Dalam kasus kami
libswift.so
misalnya, linker dinamis tidak dapat menemukanlibswift.so
diLD_LIBRARY_PATH
(yang menunjuk ke jalur pencarian default). Untuk memperbaiki masalah, Anda harus menambahkan variabel dengan pathlibswift.so
di.sumber
.so
file/usr/lib
, tetapi menjadi menarik bagi saya apakahexport
akan membantu. Meskipun proses instalasi setelahmake
berlanjut lebih lama, kesalahan lain terjadi. Kali ini,.so.0
file tidak ditemukan, tetapi keduanya.so
dan.so.0
file berada di direktori di mana saya telah membangun paket tergantung dari sumber. Bisakah Anda membantu dengan itu?Selama kompilasi dengan
g++
viamake
defineLIBRARY_PATH
jika mungkin tidak tepat untuk mengubah Makefile dengan-L
opsi. Saya telah memasukkan perpustakaan tambahan saya/opt/lib
jadi saya lakukan:dan kemudian dijalankan
make
untuk kompilasi dan penautan yang berhasil.Untuk menjalankan program dengan perpustakaan bersama tentukan:
sebelum menjalankan program.
sumber
Pertama, Anda perlu tahu aturan penamaan
lxxx
:lc
berartilibc.so
,lltdl
berartilibltdl.so
,lXtst
berartilibXts.so
.Jadi, itu
lib
+lib-name
+.so
Setelah kita tahu namanya, kita bisa menggunakan
locate
untuk mencari pathlxxx.so
file ini .Jika Anda tidak dapat menemukannya, Anda harus menginstalnya dengan
yum
(saya menggunakan CentOS). Biasanya Anda memiliki file ini, tetapi tidak terhubung ke tempat yang tepat.Tautkan ke tempat yang tepat, biasanya itu
/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
sumber
locate
hanya berfungsi jika diinstal dan berjalan secara teratur. Solusi kasar adalah untuk berjalanfind
di seluruh disk Anda, tetapi tentu saja, itu akan memakan waktu. Jika Anda sering melakukannya, pertimbangkan untuk menginstallocate
hanya untuk menurunkan biaya (interaktif, manusia) dari operasi ini.Ketika Anda mengkompilasi program Anda, Anda harus menyediakan jalur ke perpustakaan; di g ++ gunakan opsi -L:
sumber
ccmake
agarMakefile
dibuat dengan bendera yang ditautkan? Saya ingin menautkan-lARToolkitPlus
benderaku ke jalur.Kesalahan ini juga dapat terjadi jika tautan simbolik ke pustaka dinamis, .so, tetapi karena alasan lama
-static
muncul di antara bendera tautan. Jika demikian, coba hapus.sumber
Periksa lokasi perpustakaan Anda, misalnya lxxx.so:
Jika tidak ada di
/usr/lib
folder, ketikkan ini:Selesai
sumber
Terlepas dari jawaban yang telah diberikan, mungkin juga ada file * .so yang ada tetapi tidak dinamai dengan benar. Atau mungkin file * .so ada tetapi dimiliki oleh pengguna lain / root.
Edisi 1: Nama tidak benar
Jika Anda menautkan file itu
-l<nameOfLibrary>
maka nama file perpustakaan HARUS dalam bentuklib<nameOfLibrary>
Jika Anda hanya memiliki<nameOfLibrary>.so
file, ganti nama itu!Edisi 2: Pemilik yang salah
Untuk memverifikasi bahwa ini bukan masalah - lakukan
Jika file tersebut dimiliki oleh root atau pengguna lain, Anda perlu melakukannya
sumber
Perpustakaan yang saya coba taut ternyata memiliki nama yang tidak standar (mis. Tidak diawali dengan 'lib'), jadi mereka merekomendasikan menggunakan perintah seperti ini untuk mengkompilasinya -
gcc test.c -Iinclude lib/cspice.a -lm
sumber
Berikut ini informasi Ubuntu dari laptop saya.
Saya menggunakan temukan untuk menemukan file .so untuk boost_filesystem dan boost_system
Kemudian tautkan file .so ke / usr / lib dan ganti nama menjadi .so
Selesai! Paket R velocyto.R berhasil diinstal!
sumber
Saya menemukan pesan kesalahan yang sama.
Saya membangunnya
cmocka
sebagaiso
dan mencoba menautkannya ke executable saya. Tetapild
selalu mengeluh di bawah ini:Ternyata ada 3 file yang dihasilkan setelah
cmocka
dibangun:1 dan 2 adalah tautan simbol dan hanya 3 yang merupakan file asli.
Saya hanya menyalin 1 ke folder perpustakaan saya, di mana
ld
gagal menemukan 3.Setelah saya menyalin ketiga,
ld
berfungsi.sumber