2011-06-14 24 views
7

Ben örnek, iki tost kütüphaneleri libtoaster_a.so ve libtoaster_b.so ve ilişkili tüm majör/minör/devir sembolik bağ libtoaster_a.so.1.0.0 örneğin iki kütüphane var vb. Her iki kitaplık da aynı tost arabirimini uygular, ancak işlemi farklı şekilde yapar. Bu nedenle, kütüphaneyi kullanan bir uygulama oluşturduğumda, hangi uygulamanın kullanıldığının önemi yoktur (uygulama perspektifinden aynıdır).gcc bağlantı paylaştı kütüphane

Başvuru derlenmiş ve dağıtılmış edildikten sonra Sonra ya libtoaster_a işaret edebilir libtoaster.so.1 işaret libtoaster.so sembolik bir bağlantı yapmak hangisinin kullanılacağına kütüphane karar vermek istiyoruz Çünkü ve libtoaster_b.so.1. Dolayısıyla, kullanıcı/yükleyici, kullanılacak uygulamayı seçmek için libtoaster.so.1 bağlantısını değiştirebilir. yapı için

Ben varsayılan olarak libtoaster.so.1 bağlantılı
libtoaster_a.so.1 gerektiğini söylüyorlar. Uygulamamı derlediğim zaman: my_appgcc -o my_app -ltoaster... gibi bir şeyle derler ve düzgün bir şekilde libtoaster_a.so.1 ile çalışır. Ben MY_APP üzerinde ldd çalıştırmak Ancak ben dolayısıyla bağlantı etkisi yoktur libtoaster.so.1 değişen, bu libtoaster_a.so.1 ziyade arzu edildiği gibi libtoaster.so.1 bağlantılıdır göreceksiniz.

sonra libtoaster.so.1 silme ve onu yaratan libtoaster.so.1 için isimlerinin, libtoaster_a.so.1 yapım bu kütüphaneye karşı MY_APP yapmaktan daha Bunu düzeltmek için daha iyi bir yolu var mı Yine sembolik bir bağ olarak mı?

cevap

5

Paylaşılan kitaplıkları oluştururken, gcc bayraklarına "-Wl, -soname = libtoaster.so.1" öğesini ekleyin (gcc ile bağlantı kurduğunuzu varsayarak). Bu, kütüphanede DT_SONAME öğesini ayarlar ve bu kütüphaneye bağlı herhangi bir uygulamayı, dosyanın adı yerine DT_SONAME dosyasından alınan kütüphanenin ismine sahip olmaya zorlar.

[[email protected]]~/cprog/toaster1$ gcc -c my_app.c 
[[email protected]]~/cprog/toaster1$ gcc -c toaster.c 
[[email protected]]~/cprog/toaster1$ gcc -o libtoaster_a.so -shared -Wl,-soname=libtoaster.so toaster.o 
[[email protected]]~/cprog/toaster1$ gcc -R$(pwd) -L. -ltoaster_a -o my_app my_app.o 
[[email protected]]~/cprog/toaster1$ ldd my_app 
my_app: 
my_app: can't load library 'libtoaster.so' 
my_app: exit status 4 
[[email protected]]~/cprog/toaster1$ ln -s libtoaster_a.so libtoaster.so 
[[email protected]]~/cprog/toaster1$ ldd my_app 
my_app: 
    Start End  Type Open Ref GrpRef Name 
    1c000000 3c004000 exe 1 0 0  my_app 
    05b1f000 25b23000 rlib 0 1 0  /home/vps/cprog/toaster1/libtoaster.so 
    084f9000 28532000 rlib 0 1 0  /usr/lib/libc.so.51.0 
    09e80000 09e80000 rtld 0 1 0  /usr/libexec/ld.so 
[[email protected]]~/cprog/toaster1$