2011-07-15 17 views
5

DYLD_LIBRARY_PATH ayarlamak için setenv kullanıyorum, böylece bir dlopen() yaptığımda .dylib'imi bulmak için doğru yollar olacak, ancak dlopen() yaptığımda DYLD_LIBRARY_PATH’a eklediğim yolları aramıyorum.Setenv kullanarak ve sonra dlopen çağrı yapma ile ilgili sorunlar

Değişikliklerimi DYLD_LIBRARY_PATH birimine toplayabildiğim kadarıyla, bir yürütme işlemi gerçekleşene kadar geçerli olmaz. Bu doğru mu?

Ayrıca bu doğruysa, DYLD_LIBRARY_PATH değerini belirlemenin bir yolu var mı ve değişikliklerin değişmemesi işlemimin sıfırlamasını yaparak çalışır.

Bu kodu MAC OSX üzerinde yazıyorum.

Şimdiden teşekkürler.

cevap

2

Sorunun yanıtı, çevresel değişkenin dlopen üzerinde etkili olması için LD_LIBRARY_PATH sürecini yeniden yürütmeden setenv kullanamazsınız.

@exectuable_path, @loader_path veya @ rpath öğesinin bir kurulum adı yolu olarak kullanmanız gerektiğini öğrendim. Dylb bu yolla dlopen'den .dylibs üzerinde bir göreli yol araması yapabilir.

4

Mac OS bilmem ama Linux üzerinde, uzun çalıştırılabilir koşular ilk komuttan önce yükleyici kez getenv("LD_LIBRARY_PATH")değerini okur ve uzak kaydeder. Program tarafından LD_LIBRARY_PATH'un müteakip tadilatı, sadece execve() s'deki herhangi bir çocuğu etkiler, ancak sürecin kendisinde değildir. Mac OS'de benzer olduğunu hayal ediyorum.

Bunun etrafındaki genel yol, ya re-execve süreçleri (Java bunu yapar) ya da ortamı ayarlayan bir kabuk sarıcı kullanmak ve daha sonra yürütmek için gerçek ikilidir (Firefox bunu yapar).

Google, herhangi bir eşleşme bulamıyor gibi görünüyorsa da, kitaplık arama yolunu güncellemenin Mac OS özel bir yolu olabilir. Linux'ta böyle bir mekanizmanın olduğu 'un olduğunu kesinlikle eminim.

+0

Şu anda yazılımımız, LD_LIBRARY_PATH'yi ekstra yollarımızla ayarlamak için yeniden çalıştırıyor. Yeniden çalıştırmadan bunu yapmaya çalışıyordum, ama belki de MAC OS'deki tek yol budur. Bu, Xcode hata ayıklama ilk yürütme ve ikinci arasında kesintiye uğradığından beri hata ayıklaması çok daha zor hale getirir. –

+0

Java, mevcut LD_LIBRARY_PATH zaten doğru değil IFF yeniden yürütme yapar. Programınız aynı şeyi yapmalı veya sonsuz döngü girecektir. Bu nedenle, hata ayıklamak için, LD_LIBRARY_PATH öğesini yeniden çalıştırılmadan önce ayarlanmış olana (belki de Xcode'u başlatmadan önce) ayarlayın ve hata ayıklayın. –