Yeni kitaplığınızın bulunduğu yerin yolunu ekleyin LD_LIBRARY_PATH
(Mac'te biraz farklı bir adı vardır ...)
Çözümünüz -L/my/dir -lfoo
seçenekleri kullanarak çalışmalıdır , çalışma zamanında kitaplığınızın konumuna işaret etmek için LD_LIBRARY_PATH kullanın.
LD_LIBRARY_PATH kullanırken dikkatli olun - kısaca (bağlantıdan):
..implications ..:
Güvenlik : LD_LIBRARY_PATH'de belirtilen dizinlerin standart konumlardan (!) önce arandığını hatırlıyor musunuz? Bu şekilde, kötü bir kişi uygulamanızı kötü niyetli kod içeren paylaşılan bir kitaplığın bir sürümünü yüklemesini sağlayabilir! Bu, setuid / setgid çalıştırılabilir dosyalarının bu değişkeni ihmal etmelerinin bir nedeni!
Verim: Bağlantı yükleyici, paylaşılan kitaplığın bulunduğu dizini bulana kadar belirtilen tüm dizinleri aramalıdır - uygulamanın bağlantılı olduğu TÜM paylaşılan kitaplıklar için! Bu, open () 'a çok sayıda sistem çağrısı anlamına gelir ve "ENOENT (Böyle bir dosya veya dizin yok)" ile başarısız olur! Yol çok sayıda dizin içeriyorsa, başarısız çağrıların sayısı doğrusal olarak artacaktır ve bunu uygulamanın başlama zamanından anlayabilirsiniz. Dizinlerin bazıları (veya tümü) bir NFS ortamındaysa, uygulamalarınızın başlama süresi gerçekten uzun sürebilir - ve tüm sistemi yavaşlatabilir!
Tutarsızlık: Bu en yaygın sorundur. LD_LIBRARY_PATH, bir uygulamayı bağlantılı olmadığı paylaşılan bir kitaplığı yüklemeye zorlar ve bu büyük olasılıkla orijinal sürümle uyumlu değildir. Bu ya çok açık olabilir, yani uygulama çöker ya da alınan kitaplık orijinal sürümün yapacağı şeyi tam olarak yapmazsa yanlış sonuçlara yol açabilir. Özellikle ikincisinin hata ayıklaması bazen zordur.
VEYA
Bağlayıcıya gcc aracılığıyla rpath seçeneğini kullanın - çalışma zamanı kitaplığı arama yolu, standart dizine bakmak yerine kullanılacaktır (gcc seçeneği):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
Bu geçici bir çözüm için iyidir. Bağlayıcı, standart dizinlere bakmadan önce ilk olarak LD_LIBRARY_PATH kitaplıklarını arar.
LD_LIBRARY_PATH'yi kalıcı olarak güncellemek istemiyorsanız, bunu komut satırında anında yapabilirsiniz:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
Kitaplık bağlayıcısının (örnek) kullanma hakkında bildiklerini kontrol edebilirsiniz:
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
Ve uygulamanızın hangi kitaplığı kullandığını kontrol edebilirsiniz:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
dosyaların mevcut ve -.so
w / o.0
,.a
vb vs?