LD_LIBRARY_PATH nerede? LD_LIBRARY_PATH env değişkenini nasıl ayarlarım?


26

Unix kullanarak bir c ++ programı oluşturmaya çalışıyorum.

Hatayı aldım

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

LD_LIBRARY_PATH env değişkenimde libboost * 'un konumunu belirlemem gerektiğini ve daha sonra yaptığım gibi make komutunu yazarak başladığımı duydum.

-L /usr/lib64 -l boost_regex-mt

veya

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Fakat LD_LIBRARY_PATH nerede? LD_LIBRARY_PATH env değişkenini nasıl ayarlarım?


Sorunuzu anlamak için bazı yararlı bağlamlar sunarken, sorunuzun çoğunu neden düzelttiniz?
jlliagre

@jlliagre Katılıyorum: orijinal sorunun sağladığı içerik olmadan, en çok oy alan cevap hiç mantıklı değil. Geri aldım.
John1024,

Yanıtlar:


25

LD_LIBRARY_PATH env değişkenini nasıl ayarlarım?

Bunu yaptığınızda zaten ayarladınız:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Ama bu senin problemini çözmeyecek. $LD_LIBRARY_PATHDinamik olarak bağlanabilir kütüphanelerin aranacağı ek dizinlerin bir listesini sağlamak için yürütme sırasında danışılır. Bağlantı zamanında danışılmaz (belki de yerleşik araçların kendileri tarafından istenen kütüphaneleri bulmak için!).

Bağlayıcıya, derleme sırasında kitaplıkları nerede bulacağını söylemek için, -Lbağlayıcı seçeneğini kullanmanız gerekir . Bunu zaten yaptın:

-L /usr/lib64

Hala hatayı alıyorsanız, kütüphanenin gerçekten orada olduğundan emin olmanız gerekir. Eğer bir dosya var mı libboost_regex-mt.soyoksa libboost_regex-mt.ao içinde (veya herhangi) bir dizin? Bunun gibi bir dosyanın libboost_regex-mt.so.othersuffixbu amaçla sayılmadığını unutmayın. Eğer buna sahip değilseniz, muhtemelen dağıtımınızın geliştirme paketini bu kütüphane için kurmanız gerekir.


Linux altında, ld (1) man sayfasına göre $LD_LIBRARY_PATH, ayrıca şu sorulara danışılır ld: «5. Yerel bir bağlayıcı için," LD_LIBRARY_PATH "ortam değişkeninin içeriğini arayın. »
vinc17

@csx - dağıtımınız nedir? Ubuntu, Fedora, CentOS, vb. Örneğin bakınız: bkz: stackoverflow.com/questions/15874220/…
slm

@ vinc17, Manpage'den gelen bu alıntı ldsadece özyinelemeli bağımlılıklarla ilgilidir: önceden bağlanmak üzere seçilmiş bir kütüphanenin bağımlı kütüphaneleri. Yapılmakta olan çalıştırılabilir kütüphaneleri bulmakla ilgilenmez. İşte -Lbu.
Celada

@csx Bilimsel linux hakkında hiçbir şey bilmiyorum, ancak apt-getkomut bulunmazsa Debian türetilmiş değil, bu yüzden eksik paketi yüklemek için başka bir yönteme ihtiyacınız var. Bu kesinlikle sorununun ne olduğu.
Celada

Ancak en geç:: link aşamasını dahil ederken ya -Ldir -llibda argüman olarak çalışmalı , ancak orijinal ve restore edilmiş S : Endişeli normal bir makefile ile muhtemelen ihtiyacınız olan ve akıllı makefile ile zeki makefile yazarına atmak için tuğlalar dahil hemen hemen her şeye ihtiyacınız olabilir. ldgcc/g++/etcmakeLDFLAGS="whatever"
dave_thompson_085 15:15

11

LD_LIBRARY_PATH içine kalıcı olarak yeni yol eklemenin başka bir yolu:

Düzenleme .confdosya /etc/ld.so.conf.d/.

Bir uygulama yükledim ve kütüphaneleri başka bir uygulama tarafından tanınamadı. Sonra, yani yolunu eklemek /usr/local/hdf5/libiçin, x86_64-linux-gnu.confdosyanın. Sadece bir sonraki satıra koy. Kayıt etmek.

O zaman koş sudo ldconfig

İşe yaradı.

PS: OS Ubuntu 14.04


4

Bunu, ~/.profilekabuğunuzun ve / veya belirli init dosyasında (örneğin ~/.bashrc, bassh, ~/.zshenvzsh için) ayarlayabilirsiniz . Ardından kabuğunuzu yeniden başlatmanız gerekir (ve seçiminize bağlı olarak muhtemelen oturumu kapatıp tekrar açın).

Ayarlarınızı aşağıdakilerle kontrol edebilirsiniz:

env | grep '^LD_LIBRARY_PATH'

EDIT: LD_LIBRARY_PATHdosya .soisimleri tipik olarak adlarını içeren makine kodunu içeren ve ardından farklı versiyonları ayırt etmek için muhtemelen noktalarla ayrılmış sayıları takip eden paylaşılan kütüphaneler içindir . LD_LIBRARY_PATHABI uyuşmazlığı nedeniyle bir kütüphanenin bulunamaması mümkündür . Ayrıca, dillerin (Perl ve Python gibi) ve paketlerin .so, birbirleriyle ilgisi olmayan kendi kütüphaneler sistemine (muhtemelen de dosyalara sahip) sahip olabileceğini unutmayın LD_LIBRARY_PATH.


Derlenmiş programım hala bir python kütüphanesi bulmadığımdan şikayet ediyor, ancak env | grep '^ LD_LIBRARY_PATH'. Sorun ne olabilir?
Herman Toothrot

@HermanToothrot Cevabımı güncelledim. Python'un kendi kütüphaneleri sistemine sahip olduğunu unutmayın. Kullanmadığından şüpheleniyorum LD_LIBRARY_PATH(normal kütüphanelerle çakışmaları önlemek için). Bunun için özel bir soru sormanız gerekir, hata mesajı alırsınız.
vinc17

3

Kitaplık yolu hatanız bağlayıcıdaysa, derleme sırasında, kütüphaneye yolu $ LD_LIBRARY_PATH değişkenine eklemeniz gerekir. Derlenmiş programı gerçekten çalıştırdığınızda kütüphane hatasıysa, kütüphane yolunu /etc/ld.so.conf dosyasına eklemeniz ve kütüphane arama yolu önbelleğini yeniden oluşturmak için ldconfig komutunu çalıştırmanız gerekir.


Bu harika çalıştı! Conf dosyam, /etc/ld.so.conf.d dizinine işaret ediyor, bu yüzden libs yolunuzla o klasöre bir dosya ekleyin. Ayrıca, ldconfig
komutunu

0

Şununla çözüldü:

eklemek /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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.