Kütüphaneler ve GCC
Önceki GNU C Derleyicisi Kullanımı Sonraki
Kütüphaneler ve GCC
Yazılım kütüphaneleri, daha sonra yeni geliştirilecek yazılımlara dahil edilmek üzere saklanan derlenmiş hazır kod ve veri dosyalarıdır. Kütüphane dosyaları, modüler yazılım geliştirmeye olanak sağlarlar
Statik Kütüphaneler
Statik kütüphaneler, yeniden derlenmeye ihtiyaç duymaksızın yazılıma derleme aşamasında yani çalıştırılmadan önce eklenir. lib dizinlerindeki “.a” uzantılı dosyalar statik kütüphanelerdir. Derleme zamanını azaltmak için yakın geçmişe kadar statik kütüphaneler kullanılıyordu. Ancak günümüzün hızlı bilgisayarları için derleme zamanı sorun olmaktan çıktı. Bu nedenle statik kütüphaneler artık tercih edilmemektedir. Ancak yine de kütüphane kodlarını açmak istemeyenler için kullanışlıdır.
Statik kütüphane oluşturmak için ar(1) komutu kullanılır.
# ar rc libtest.a test.o util.o
Bu komut libtest.a kütüphanesini oluşturur, test.o ve util.o nesne dosyalarını bu kütüphaneye ekler. c seçeneği ile eğer kütüphane yoksa oluşturulması belirtilmiş olunur. Eğer varsa nesne dosylarını bu kütüphaneye ekler. r seçeneği ile eski nesne dosyalarının yenileri ile değiştirilmesi talep edilir.
Yeni oluşturulan veya değiştirilen bir kütüphane dosyasını yeniden indekslemek gerekir. Bu işlem derleme sırasında derleyicinin sembolleri denetlemesini hızlandırmak içindir. İndeks oluşturmak için ranlib(1) kullanılır.
# ranlib libtest.a
Derlenecek bir yazılıma daha önce oluşturduğumuz bir kütüphaneyi dahil etmek için gcc‘ye –l seçeneği ile kütüphane ismi parametre olarak verilmelidir. Bu işlem için tercih edilmese de doğrudan ld(1) kullanılabilir.
# gcc prog.o –L/home/simsek/libtest –ltest
-l ile kütüphane ismini verirken dosya isminin başındaki lib'in kaldırıldığına dikkat edilmeli. –L seçeneği ile gcc'ye kütüphaneleri ararken hangi dizinleri kullanacağı bildirilir.
Aşağıda bir kütüphane oluşturma ve kullanma senaryosu mevcut:
# cat main.c

#include <stdio.h>

/* işlevler external bildirilmeli */
extern void test();
extern void util();

int main() {
  printf("main içinde\n");
  /* Kütüphane içinden işlev çağıralım */
  test();
  util();
  return 0;
}

# cat test.c

int test() {
  printf("Test içerisinde\n");
  return 0;
}

# cat util.c

int util() {
  printf("Util içerisinde\n");
  return 0;
}

# gcc -c test.c
# gcc –c util.c
# ar rc libtest.a test.o util.o
# ranlib libtest.a
# gcc -c main.c
# gcc main.o -L /home/simsek -ltest -o testprog
Son satırda kütüphane işlevlerini kullanan yazılım derlenip testprog isimli çalışabilir dosya derleyici tarafından oluşturuldu. testprog çalıştırıldığında aşağıdaki çıktıyı verecektir:
# ./testprog
main içinde
Test içerisinde
Util içerisinde
Paylaşımlı (Shared) Kütüphaneler
Paylaşımlı kütüphaneler, yazılım çalıştırıldığında sürece dahil edilirler. Yazılımın içerisine gerçekten kod eklenmez. Paylaşımlı kütüphaneden bir işlev cağrılan yerlere, kütüphaneye bir referans verilir. Kütüphaneyi kullanan bütün yazılımlar bu şekilde aynı işlev kütüphanesini ortak kullanırlar.
Paylaşımlı her kütüphane “so ismi” (soname) denilen bir özel isme sahiptir. “so ismi” kütüphanenin gerçek dosya ismine sembolik bağdır. Ayrıca derleyicinin bir kütüphaneyi talep ettiğinde kullandığı bir de ilintileyici ismi vardır. Bu, sürüm numarası olmayan bir so ismi olarak düşünülebilir.
simsek@mail:/usr/lib$ ls libz*
libz.a libz.so.1@ libz.so.1.2.1.1*
Listede görülen libz.a statik kütüphaneye aittir. libz.so.1 ise libz.so.1.2.1.1 paylaşımlı kütüphanesine sembolik bağ olarak kütüphanenin so ismidir. Bu kütüphane için ilintileyici ismi libz.so'dur.
Yazılımlar içerisinde kütüphanelerin so isimleri tutulur. Bu sayede kütüphanede bir değişiklik yapıldığında yeni kütüphane kullanıma alınmış olunur.
Önceki Üst Ana Başlık Sonraki
Basit GCC Kullanımı Başlangıç GNU Debugger Kullanımı
Bir Linux Kitaplığı Sayfası