Untuk mencari tahu apa yang dicari linker, jalankan dalam mode verbose.
Misalnya, saya mengalami masalah ini saat mencoba mengkompilasi MySQL dengan dukungan ZLIB. Saya menerima kesalahan seperti ini selama kompilasi:
/usr/bin/ld: cannot find -lzlib
Saya melakukan beberapa Googl'ing dan terus menemukan masalah berbeda dari jenis yang sama di mana orang akan mengatakan untuk memastikan file .so benar-benar ada dan jika tidak, maka buat symlink ke file berversi, misalnya, zlib. jadi.1.2.8. Tapi, ketika saya cek, zlib.so DID ada. Jadi, saya pikir, pasti bukan itu masalahnya.
Saya menemukan posting lain di Internet yang menyarankan untuk menjalankan make dengan LD_DEBUG=all:
LD_DEBUG=all make
Meskipun saya mendapat TON keluaran debug, itu sebenarnya tidak membantu. Itu menambah lebih banyak kebingungan daripada yang lainnya. Jadi, saya hampir menyerah.
Kemudian, saya mendapat pencerahan. Saya berpikir untuk benar-benar memeriksa teks bantuan untuk perintah ld:
ld --help
Dari situ, saya menemukan cara menjalankan ld dalam mode verbose (bayangkan itu):
ld -lzlib --verbose
Ini adalah output yang saya dapatkan:
==================================================
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 memperbaikinya sehingga saya dapat mengkompilasi MySQL dengan ZLIB versi saya sendiri (bukan versi bundel):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
Voila!
Jika nama perpustakaan Anda ucapkan libxyz.so
dan terletak di jalur say:
/home/user/myDir
lalu untuk menautkannya ke program Anda:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Sepertinya tidak ada jawaban yang mengatasi masalah pemula yang sangat umum karena gagal menginstal pustaka yang diperlukan.
Pada platform Debianish, jika libfoo
hilang, Anda sering dapat menginstalnya dengan sesuatu seperti
apt-get install libfoo-dev
-dev
versi paket diperlukan untuk pekerjaan pengembangan, bahkan pekerjaan pengembangan yang sepele seperti mengompilasi kode sumber untuk ditautkan ke perpustakaan.
Nama paket terkadang memerlukan beberapa dekorasi (libfoo0-dev
? foo-dev
tanpa lib
awalan? dll), atau Anda cukup menggunakan pencarian paket distro Anda untuk mengetahui dengan 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 pekerjaan pengembangan yang serius.)
Untuk arsitektur lain (terutama RPM) berlaku prosedur serupa, meskipun detailnya akan berbeda.