B.3. Kütüphaneler
Kütüphane Oluşturma Ve Kullanma
Bir takım C fonksiyonları ve dışsal değişkenler içeren birden fazla
(.o
dosya tipli) amaç dosya oluşturup bunları
$ ar -crs libbenim.a *.o
komutu ile bir kütüphane haline getirebiliriz.
Bunlara statik kütüphane
adı verilir. Sistemde bu tip hazır statik kütüphaneler
genelde /usr/lib
dizini altında durur ve dosya tipleri
(yukarıdaki örnekte de olduğu gibi) .a
olur.
Bir programın bağlanma işlemi esnasında program amaç dosyaları içinde
tanımlanmamış olan fonksiyon ve değişkenler bu tip sistem tarafından
tanımlanmış standart kütüphanelerden bulunmaya çalışılır. Eğer kendi
oluşturduğumuz bir kütüphaneyi de kullanmak istersek, gcc
komutunun en sonuna kendi kütüphanemizin dosya adını ekleyebiliriz:
$ gcc prog.c libbenim.a
Böylece, bağlayıcı tarafından standart kütüphanelerden bulunamayan fonksiyon ve değişkenler bizim kütüphaneden bulunmaya çalışılacaktır.
Yukarıda anlatılan derleme ve bağlama işlemi sonrasında
(.o
amaç kod dosyaları ve .a
kütüphanelerinden)
elde edilen tüm amaç kod oluşan tek bir çalıştırılabilir
a.out
dosyasında toplanmış olur.
Kütüphanelerde yapılacak olası bir yenileme sonrasında,
yeni kodun devreye girmesi için, en azından bağlama işleminin
tekrar yapılması gerekecektir.
Devingen Bağlama ve Paylaşılan Kütüphaneler
Paylaşılan kütüphaneler, bağlama zamanında değil, çalışma zamanında bir programa bağlanabilen amaç dosyalarıdır. Paylaşılan kütüphane kullanımının bir dizi avantajı vardır: Bunları kullanan programın çalıştırılabilir dosyası daha küçüktür; modüler ve bağımsız güncellemeye izin verirler; sistem belleğinin daha verimli kullanılmasını sağlarlar.
Yukarıdaki örnekten devam edersek,
$ gcc -shared -o libbenim.so kutup.c
komutu ile kutup.c
dosyasında
bulunan dışsal değişken ve fonksiyonları libbenim.so
ismindeki paylaşılan kütüphaneye dönüştürdükten sonra, bunları kullanan
prog.c
ismindeki bir kaynak programı
uygun bir şekilde derleyip, bu paylaşılan kütüphaneye devingen bir
şekilde bağlamak için
$ gcc prog.c libbenim.so
komutunu kullanabiliriz. Bu şekilde oluşan
a.out
programı çalışma sırasında libbenim.so
kütüphanesine bağlanacaktır. Buna
devingen bağlama
denir. libbenim.so
dosyasında güncelleme ihtiyacı olduğunda,
eğer prog.c
kaynak kodunda herhangi bir değişiklik olmamışsa,
yukarıdaki prog.c
derleme işleminin tekrar edilmesine gerek
olmayacaktır. Bir sonraki a.out
komutu çalıştırıldığında
yeni libbenim.so
kütüphanesini kullanmaya başlayacaktır.
Programların çalışması için gerekli olan devingen kütüphanelerin
kolayca bulunabilmesi için, standart bir yer olan /usr/lib
dizini kullanılır. Ancak, eğer bir programın kullandığı bir paylaşılan
kütüphane başka bir yerde duruyorsa, bunun uygun bir şekilde
çalışma sırasında belirtilmesi gerekir. Bizim sistemde bu amaç için
LD_LIBRARY_PATH
çevresel değişeni kullanılır. a.out
programı çalıştırılmadan önce, aşağıdaki komutun girilmesi gerekir:
$ export LD_LIBRARY_PATH=/devingen/kutuphanenin/bulundugu/dizin