/*
 * Copyright (c) 2004 Bar�� ��M�EK.
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.2
 * or any later version published by the Free Software Foundation;
 * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
 * Texts.  A copy of the license is included in the section entitled "GNU
 * Free Documentation License".
 *
 * Bu belgenin telif haklar� 'GNU Free Documentation License'
 * lisans� �artlar� alt�nda Bar�� ��M�EK'e aittir.
 *
 * K�k: http://www.acikkod.org
 * S�r�m No: 1
 * �lk bask�: 2004-08-18
 * Son g�ncelleme: 2004-08-18
 *
 */

Kod Geliştirme-1: Program Kütüphaneleri

Program kütüphaneleri, daha sonra yeni yaz�lacak programlara dahil edilmek üzere saklanan derlenmi� haz�r kod ve veri dosyalar�d�r. Kütüphane dosyalar�, modüler programlama sunarlar.

Statik Kütüphaneler

Statik kütüphaneler, yeniden derlenmeye ihtiyaç duymaks�z�n programa 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 statik kütüphaneler kullan�l�yordu. Ancak günümüzün h�zl� bilgisayarlar� için derleme zaman� problem 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 object dosyalar�n� bu kütüphaneye ekler. “c” parametresi ile e�er kütüphane yoksa olu�turulmas� belirtilmi� olunur. E�er varsa object dosylar� bu kütüphaneye ekler. “r” parametresi ile eski object dosyalar�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 kontrolünü h�zland�rmak içindir. �ndeks olu�turmak için ranlib(1) kullan�l�r.

# ranlib libtest.a  

Derlenecek bir programa daha önce olu�turdu�umuz bir kütüphaneyi dahil etmek için gcc(1) ‘ye –l 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 parametresi gcc'ye kütüphaneleri ararken hangi dizinleri kullanaca��n� bildirir.

A�a��da bir kütüphane olu�turma ve kullanma senaryosu mevcut:

# cat main.c
#include <stdio.h>
/* fonksiyonlar external tanimlanmali */
extern void test();
extern void util();
int main() {
  printf("main icinde\n");
  /* Kutuphane icinden fonksiyon cagiralim */
  test();
  util();
  return 0; 
} 
# cat test.c
int test() {
  printf("Test icerisinde\n");
  return 0;
}
# cat util.c
int util() {
  printf("Util icerisinde\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 fonksiyonlar�n� kullanan program derlenip ‘testprog' isimli çal��abilir dosya derleyici taraf�ndan olu�turuldu. Program çal���t�r�ld���nda a�a��daki ç�kt�y� verecektir:

# ./testprog
main icinde
Test icerisinde
Util icerisinde

Ortak Payla��lan (Shared) Kütüphaneler

Payla��lan (shared) kütüphaneler, program çal��t�r�ld���nda programa dahil edilirler. Program�n içerisine gerçekten kod eklenmez. Payla��ml� kütüphaneden bir fonksiyon ca�r�lan yerlere, kütüphaneye bir referans verilir. Kütüphaneyi kullanan bütün programlar bu �ekilde ayn� fonksiyon kütüphanesini ortak kullan�rlar.

Payla��ml� her kütüphane “soname” denilen özel isme sahiptir. “soname” isimleri gerçek isimlerine bir linktir. Ayr�ca derleyicinin bir kütüphaneyi talep etti�inde kulland��� linker ismi vard�r. Bu, versiyonu olmayan bir soname olarak dü�ünülebilir.

s[email protected]:/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 link olan soname'dir. Bu kütüphane için linker ismi libz.so'dur.

Programlar içerisinde soname'ler tutulur. Bu sayede kütüphanede bir de�i�iklik yap�ld���nda yeni kütüphane kullan�ma al�nm�� olunur.