Standart C Programlama Dili


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