LD_LIBRARY_PATH ve LIBRARY_PATH


159

Ben basit bir C ++ programı inşa ediyorum ve geçici olarak bir sistem tarafından sağlanan paylaşılan kütüphane geliştirme ve test için, daha yeni bir sürümü ile değiştirmek istiyorum.

LD_LIBRARY_PATH değişkenini ayarlamayı denedim ama linker (ld) ile başarısız oldu:

/ usr / bin / ld: -lyaml-cpp bulunamıyor

Çalışmasını bekliyordum çünkü ld man sayfasına göre:

Bağlayıcı, gerekli paylaşılan kitaplıkları bulmak için aşağıdaki arama yollarını kullanır: ... Yerel bir bağlayıcı için "LD_LIBRARY_PATH" ortam değişkeninin içeriği ...

Daha sonra LIBRARY_PATH ayarını denedim ve bu işe yaradı.

GCC kılavuzuna göre:

LIBRARY_PATH değeri PATH gibi kolonla ayrılmış bir dizin listesidir. Yerel derleyici olarak yapılandırıldığında, GCC, özel bağlayıcı dosyaları ararken GCC_EXEC_PREFIX kullanarak bulamazsa, belirtilen dizinleri dener. GCC kullanarak bağlama, bu dizinleri -l seçeneği için sıradan kütüphaneler ararken de kullanır (ancak -L ile belirtilen dizinler önce gelir).

(GCC) kılavuzunun da belirttiği gibi, GIB ile bağlantı kurduğum için LIBRARY_PATH çalışıyor.

Fakat..

  • Ben gcc ile bağlantı beri hata mesajı önerdiği gibi neden ld çağrılıyor?
  • İki amaca aynı amaca hizmet etmenin anlamı nedir? Başka farklar var mı?

Yanıtlar:


213

LIBRARY_PATH gcc tarafından derlenmeden önce programınıza bağlanması gereken statik ve paylaşılan kitaplıklar içeren dizinleri aramak için kullanılır.

LD_LIBRARY_PATH, programınız tarafından başarıyla derlendikten ve bağlandıktan sonra paylaşılan kitaplıkları içeren dizinleri aramak için kullanılır .

DÜZENLEME: Aşağıda belirtildiği gibi, kitaplıklarınız statik veya paylaşılan olabilir. Statik ise, kod programınıza kopyalanır ve programınız derlendikten ve bağlandıktan sonra kitaplığı aramanız gerekmez. Kütüphaneniz paylaşılıyorsa, programınıza dinamik olarak bağlanması gerekir ve işte o zaman devreye LD_LIBRARY_PATHgirer.


14
Ve elbette LD_LIBRARY_PATH sadece dinamik kütüphanelerle mantıklı
Alex Jasmin

2
Demek istediğim, ld'yi (doğrudan) bağlamak için ld kullanacak olsaydım, ld kılavuzuna göre, LD_LIBRARY_PATH programının programıma bağlanması gereken kütüphaneleri içeren dizinleri aramak için kullanılmış olurdu. Burada bir şey eksik olmalıyım ..
Georgios Politis

2
kendiniz çağırmazsanız ve nesne dosyalarını kütüphanelerle birleştirmezseniz, gcc'nin geçtiği yolu 'devralır'. -Xlinker seçenekleriyle standart gcc'yi geçersiz kılabilirsiniz.
Naveen

5
Aslında, yalnızca statik kütüphaneler yerine LIBRARY_PATH statik VE dinamik kütüphaneler içeren dizinleri aramak için kullanılır .
particle128

3
Evet bu yanlış - fark olmasıdır LIBRARY_PATHde kütüphaneler (statik veya dinamik) aranır derleme zamanında ve LD_LIBRARY_PATHçalışma zamanında dinamik kütüphaneleri aranır. Elbette çalışma zamanında statik kütüphaneleri aramanıza gerek yoktur.
Timmmm

47

LD_LIBRARY_PATH, program başladığında LIBRARY_PATHaranır, bağlantı zamanında aranır.

yorumlardan uyarı :


38
Not: kütüphaneleri bağlarken, ldya kendi başına ya LIBRARY_PATHda kütüphaneleri aramaz LD_LIBRARY_PATH. O sadece var gccçağırır ldo LIBRARY_PATHkullanılır hale gelir. (Bunu zor yoldan öğrendim.)
Rufflewind

1
@Rufflewind İlginç, ancak herhangi bir referans vermiş olsaydınız daha da fazla olurdu.
hmijail

Bu görünüm, kitaplıkların arandığı an (bağlantı zamanı ile çalışma zamanı arasındaki bağlantı) ayrılırken @Naveen, aranan kitaplık türünü (statik v dinamik) ayırır. Etkili olarak özdeş iki görünüm var mı (dinamik: çalışma süresi = statik: bağlantı süresi) veya bu yazışmanın geçerli olmadığı önemli durumlar var mı? Derleme zamanında da dinamik kütüphaneler hakkında biraz bilgiye ihtiyaç olduğunu tahmin ediyorum.
XavierStuvw

13

Ben gcc ile bağlantı beri hata mesajı önerdiği gibi neden ld çağrılıyor?

gcc bağlantı modundayken dahili olarak ld'yi çağırır.

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.