di mana LD_LIBRARY_PATH? bagaimana cara mengatur variabel env LD_LIBRARY_PATH?

26

Saya mencoba membangun program c ++ menggunakan Unix.

Saya mendapat kesalahan

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

Saya mendengar bahwa saya hanya perlu mengatur lokasi libboost * di variabel env LD_LIBRARY_PATH saya dan kemudian memanggil make seperti yang saya lakukan sebelumnya, dengan mengetik

-L /usr/lib64 -l boost_regex-mt

atau

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Tetapi di mana LD_LIBRARY_PATH? bagaimana cara mengatur variabel env LD_LIBRARY_PATH?

csx
sumber
Mengapa Anda mengedit sebagian besar pertanyaan Anda saat itu memberikan konteks yang berguna untuk memahami masalah Anda?
jlliagre
@ jlliagre Saya setuju: tanpa konteks yang disediakan oleh pertanyaan awal, jawaban pilihan teratas tidak masuk akal. Aku menggulungnya kembali.
John1024

Jawaban:

25

bagaimana cara mengatur variabel env LD_LIBRARY_PATH?

Anda sudah mengaturnya saat melakukan ini:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Tetapi itu tidak akan menyelesaikan masalah Anda. $LD_LIBRARY_PATHdikonsultasikan pada saat eksekusi, untuk memberikan daftar direktori tambahan untuk mencari perpustakaan yang dapat dihubungkan secara dinamis. Itu tidak dikonsultasikan pada waktu tautan (kecuali mungkin untuk menemukan perpustakaan yang dibutuhkan oleh alat yang dibangun sendiri!).

Untuk memberi tahu linker di mana menemukan perpustakaan saat membangun, Anda perlu menggunakan -Lopsi tautan . Anda sudah melakukannya juga:

-L /usr/lib64

Jika Anda masih mendapatkan kesalahan, maka Anda perlu memastikan bahwa perpustakaan benar-benar ada. Apakah Anda memiliki file libboost_regex-mt.soatau libboost_regex-mt.adi direktori (atau ada) itu? Perhatikan bahwa file seperti libboost_regex-mt.so.othersuffixtidak dihitung untuk tujuan ini. Jika Anda tidak memilikinya, maka Anda mungkin perlu menginstal paket pengembangan distribusi Anda untuk perpustakaan ini.

Celada
sumber
Di Linux, menurut halaman manual ld (1), $LD_LIBRARY_PATHjuga dikonsultasikan dengan ld: «5. Untuk penaut asli, cari konten variabel lingkungan" LD_LIBRARY_PATH ". »
vinc17
@csx - apa distro Anda? Ubuntu, Fedora, CentOS, dll? Lihat di sini, misalnya: stackoverflow.com/questions/15874220/…
slm
@ vinc17, Kutipan dari halaman ldmanual hanya menyangkut dependensi rekursif: pustaka dependen dari pustaka yang sudah dipilih untuk dihubungkan Itu yang -Ldilakukannya.
Celada
@csx Saya tidak tahu apa-apa tentang linux ilmiah, tetapi jika apt-getmemberi Anda perintah tidak ditemukan maka itu bukan Debian jadi Anda perlu metode lain untuk menginstal paket yang hilang. Itulah yang pasti menjadi masalah Anda.
Celada
Terlambat tetapi: -Ldir -llibharus berfungsi sebagai argumen untuk ldatau gcc/g++/etcketika termasuk fase tautan, tetapi Q asli & dipulihkan menyebutkan make: dengan makefile normal yang mungkin Anda perlukan LDFLAGS="whatever"dan dengan makefile pintar, Anda mungkin memerlukan hampir semua hal, termasuk batu bata untuk dilemparkan ke pembuat makefile yang pintar.
dave_thompson_085
11

Cara lain untuk menambahkan jalur baru secara permanen di LD_LIBRARY_PATH:

Edit .conffile dalam /etc/ld.so.conf.d/.

Saya pernah menginstal aplikasi dan perpustakaannya tidak dapat dikenali oleh aplikasi lain. Lalu saya menambahkan path, yaitu /usr/local/hdf5/libke x86_64-linux-gnu.conffile. Masukkan saja ke baris berikutnya. Menyimpan.

Lalu lari sudo ldconfig

Itu berhasil.

PS: OS Ubuntu 14.04

iparjono
sumber
4

Anda dapat mengaturnya di ~/.profilefile init spesifik Anda dan / atau shell Anda (misalnya ~/.bashrcuntuk bash, ~/.zshenvuntuk zsh). Maka Anda perlu me-restart shell Anda (dan mungkin logout dan login lagi, tergantung pada pilihan Anda).

Anda dapat memeriksa pengaturan Anda dengan:

env | grep '^LD_LIBRARY_PATH'

EDIT: LD_LIBRARY_PATHadalah untuk pustaka bersama yang berisi kode mesin, yang nama filenya biasanya berisi .sodalam namanya, mungkin diikuti oleh angka yang dipisahkan oleh titik untuk membedakan versi yang berbeda. Ada kemungkinan bahwa meskipun LD_LIBRARY_PATH, perpustakaan tidak ditemukan karena ketidakcocokan ABI. Perhatikan juga bahwa bahasa (seperti Perl dan Python) dan paket mungkin memiliki sistem perpustakaan mereka sendiri (mungkin juga dengan .sofile), tidak terkait LD_LIBRARY_PATH.

vinc17
sumber
Program saya yang dikompilasi masih mengeluh tentang tidak menemukan perpustakaan python meskipun saya melihat jalan yang benar menggunakan env | grep '^ LD_LIBRARY_PATH'. Apa yang bisa menjadi masalah?
Herman Toothrot
@HermanToothrot Saya sudah memperbarui jawaban saya. Perhatikan bahwa python memiliki sistem perpustakaannya sendiri. Saya menduga itu tidak digunakan LD_LIBRARY_PATH(untuk menghindari tabrakan dengan perpustakaan yang biasa). Anda perlu mengajukan pertanyaan khusus untuk ini, dengan pesan kesalahan yang Anda dapatkan.
vinc17
3

Jika kesalahan jalur perpustakaan Anda ada di tautan, saat kompilasi, Anda perlu menambahkan jalur ke perpustakaan ke dalam variabel $ LD_LIBRARY_PATH. Jika kesalahan pustaka adalah ketika Anda benar-benar menjalankan program yang dikompilasi maka Anda perlu menambahkan path pustaka ke /etc/ld.so.conf dan jalankan ldconfig untuk membangun kembali cache path pencarian pustaka.

Gary
sumber
ini berhasil! File conf saya menunjuk ke direktori ini /etc/ld.so.conf.d jadi tambahkan saja file dengan path libs Anda ke folder itu. juga pastikan untuk menjalankan ldconfig sebagai root (atau sudo)
RLaaa
0

Dipecahkan dengan:

tambahkan ke /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
Dave
sumber