LD_LIBRARY_PATH vs LIBRARY_PATH

159

Saya sedang membangun program C ++ sederhana dan saya ingin sementara mengganti sistem perpustakaan bersama yang disediakan dengan versi yang lebih baru, untuk pengembangan dan pengujian.

Saya mencoba mengatur variabel LD_LIBRARY_PATH tetapi tautannya (ld) gagal dengan:

/ usr / bin / ld: tidak dapat menemukan -lyaml-cpp

Saya berharap itu berfungsi karena menurut halaman manual ld:

Linker menggunakan jalur pencarian berikut untuk menemukan perpustakaan bersama yang diperlukan: ... Untuk linker asli, isi variabel lingkungan "LD_LIBRARY_PATH" ...

Saya kemudian mencoba mengatur LIBRARY_PATH, dan itu berhasil.

Menurut manual GCC:

Nilai LIBRARY_PATH adalah daftar direktori yang dipisahkan oleh titik dua, seperti PATH. Ketika dikonfigurasikan sebagai kompiler asli, GCC mencoba direktori yang ditentukan saat mencari file linker khusus, jika tidak dapat menemukannya menggunakan GCC_EXEC_PREFIX. Menautkan menggunakan GCC juga menggunakan direktori ini ketika mencari pustaka biasa untuk opsi -l (tetapi direktori yang ditentukan dengan -L didahulukan).

Seperti yang disarankan oleh manual (GCC), LIBRARY_PATH berfungsi karena saya terhubung dengan GCC.

Tapi..

  • Karena saya terhubung dengan gcc mengapa ld dipanggil, seperti pesan kesalahan menyarankan?
  • Apa gunanya memiliki dua variabel yang melayani tujuan yang sama? Apakah ada perbedaan lain?
Georgios Politis
sumber

Jawaban:

213

LIBRARY_PATH digunakan oleh gcc sebelum dikompilasi untuk mencari direktori yang berisi pustaka statis dan bersama yang harus ditautkan ke program Anda.

LD_LIBRARY_PATHdigunakan oleh program Anda untuk mencari direktori yang berisi pustaka bersama setelah berhasil dikompilasi dan ditautkan.

EDIT: Seperti yang ditunjukkan di bawah, perpustakaan Anda bisa statis atau dibagikan. Jika statis maka kode tersebut disalin ke dalam program Anda dan Anda tidak perlu mencari perpustakaan setelah program Anda dikompilasi dan ditautkan. Jika perpustakaan Anda dibagikan, maka perpustakaan itu harus ditautkan secara dinamis ke program Anda dan saat itulah LD_LIBRARY_PATHmulai berlaku.

Naveen
sumber
14
Dan tentu saja LD_LIBRARY_PATH hanya masuk akal dengan perpustakaan dinamis
Alex Jasmin
2
Maksud saya adalah jika saya menggunakan ld untuk menghubungkan (langsung), maka, menurut manual ld, LD_LIBRARY_PATH akan digunakan untuk mencari direktori yang berisi perpustakaan yang perlu dihubungkan dengan program saya. Saya pasti melewatkan sesuatu di sini ..
Georgios Politis
2
kecuali jika Anda memanggil ld sendiri dan menggabungkan file objek dengan pustaka, itu akan 'mewarisi' jalan yang dilewati gcc ke sana. Anda dapat mengganti gcc standar, dengan opsi -Xlinker.
Naveen
5
Sebenarnya, LIBRARY_PATH digunakan untuk mencari direktori yang berisi perpustakaan statis DAN dinamis, bukan hanya perpustakaan statis.
partikel128
3
Ya ini salah - perbedaannya adalah yang LIBRARY_PATHmencari pustaka (statis atau dinamis) pada waktu kompilasi dan LD_LIBRARY_PATHdicari pustaka dinamis pada saat run time. Tentu saja pada saat run time Anda tidak perlu mencari perpustakaan statis.
Timmmm
47

LD_LIBRARY_PATHdicari ketika program dimulai, LIBRARY_PATHdicari pada waktu tautan.

peringatan dari komentar :

F'x
sumber
38
Catatan: saat menautkan pustaka, lddengan sendirinya tidak mencari pustaka di salah satu LIBRARY_PATHatau LD_LIBRARY_PATH. Hanya ketika gccmemanggil ldyang LIBRARY_PATHdigunakan. (Mempelajari ini dengan cara yang sulit.)
Rufflewind
1
@Rufflewind Menarik, tetapi akan lebih bahkan jika Anda telah memberikan referensi.
hmijail berduka pada orang-orang yang mengundurkan diri
Tampilan ini membuat perbedaan pada saat perpustakaan dicari (waktu tautan versus waktu berjalan) sementara @Naveen membuat perbedaan jenis perpustakaan yang dicari (statis dan dinamis). Apakah ada dua tampilan yang secara efektif identik (dinamis: waktu berjalan = statis: waktu tautan) atau ada situasi penting ketika korespondensi ini tidak berlaku? Saya kira beberapa pengetahuan tentang perpustakaan dinamis diperlukan juga pada waktu kompilasi.
XavierStuvw
13

Karena saya terhubung dengan gcc mengapa ld dipanggil, seperti pesan kesalahan menyarankan?

panggilan gcc ld secara internal ketika sedang dalam mode menghubungkan.

heroxbd
sumber