2009-11-23 13 views
13

Kod yeniden kullanım amacıyla çeşitli kitaplıklara ayrılmış bir uygulama var. Windows'da tek yapmam gereken .dll dosyalarını yürütülebilir dosya ile aynı yola koymak ve bunları otomatik olarak bulur. Linux'ta (işlerin yollarını kodladığı için) LD_LIBRARY_PATH çevre değişkenini belirtmek veya yürütülebilir dosyaları çalıştırmadan önce kütüphaneleri önceden yüklemek zorundayım.Yürütülebilir dizin olarak paylaşılan kitaplık yolu

-Wl,-rpath=<PATH> bağlayıcı seçeneği kullanılarak yolu yerleştirme hakkında bazı şeyler gördüm ve yolu olarak . kullanarak denedim. Ancak bu sadece geçerli çalışma dizinine bakar, yürütülebilir dizinin değil.

Varsayılan olarak (Windows'ta olduğu gibi) paylaşılan kitaplıkların yürütülebilir dizinine bakmak için bağlayıcıda belirtmenin bir yolu var mı?

Teşekkürler! Matt

cevap

18

RPATH'nızda, ld ya da diğer Darwin aracına uygun bir seçenek aracılığıyla $ ORIGIN'a ihtiyacınız var. this ve this'a bakın.

$ 'ın gerçekten yolun içinde bitmesi gerektiğini unutmayın, bu nedenle bağlantı komut satırında alıntı yapmanız veya bu koddan kaçmanız gerekir.

Güncelleme:

0x0000000f (RPATH)    Library rpath: [$ORIGIN] 
+4

$ ORIGIN'i kullanırken, linker'ın gerçekten görmesini sağlamak için $ 'nın uygun şekilde alıntılandığından emin olmanız gerekir. Komut satırından "-rpath \ $ ORIGIN" ve bir Makefile istediğiniz "-rpath \ $$ ORIGIN" –

+0

Eclipse ve CDT kullanıyorum ve seçeneği çeşitli bağlayıcı bayraklarının altına koyuyorum. Ben -Wl, -rpath = $$ ORIGIN 'koyuyorum ve çıkış penceresinde tek bir $ ile gösterir. Ama işe yaramıyor. Birkaç varyasyonu denedim, ama hiçbir şey olmuyor. Linker sadece bayrağı görmezden geliyor gibi. Ben denedim: -Wl, -rpath = $ ORIGIN -Wl, - rpath = $ ORIGIN -Wl, -rpath =/$ ORIGIN -Wl, -rpath = $ ORIGIN/ -Wl, -rpath =/$ ORIGIN/ vb – CuppM

+0

Orada ne olduğunu görmek için elfdump veya yerel eşdeğerini kullanın? Ldd'i kullan ve ne yazdığını görüyor musun? – bmargulies

2

bir kabuk komut programı sarın: Sen bağlayıcı aslında Burada

readelf -d /path/to/exe | grep RPATH 

ile yürütülebilir koymak görebilirsiniz çıktı gibi görünmelidir şudur:

#!/bin/sh 

PROGRAM_DIRECTORY="`dirname "$0"`" 
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY" 

"$PROGRAM_DIRECTORY/program_executable" "[email protected]" 

Bu komut dosyasını (çalıştırıcınızın yerine) çalıştırırsanız y Programımız sadece iyi bağlantı kuracak.

+0

Evet, yaptığım şey bu ve çalışıyor. Uygulama OpenMPI kullanarak paralelleştirilmiş bir versiyona sahiptir ve LD_LIBRARY_PATH'yi paylaşmanın bir yolu vardır. Bu yüzden şu anda bu çözümü kullanıyoruz, ancak daha kolay bir yol yapmak istiyoruz çünkü uygulama (aynı zamanda MPI koşucusu) – CuppM

+0

neyin işleneceği konusunda birden fazla bayrak alıyor. Tüm argümanları komut dosyanızdan programa aktarabilirsiniz. ' "$ @"'. –

İlgili konular