Serial Tutorial C (12) : Membuat Link dengan External Libraries



Sebuah library adalah koleksi dari file-file objek pra kompilasi yang dapat dihubungkan ke program. Penggunaan yang paling umum dari library adalah untuk menyediakan fungsi-fungsi sistem, seperti akar kuadrat dari fungsi sqrt dapat ditemukan di library matematika C.
Library umumnya disimpan dalam file arsip dengan ekstension *.a yang merujuk kepada library statis. Librari ini dibuat dibuat dari file-file objek dengan suatu perangkat terpisah yakni GNU archiver ar, dan digunakan oleh linker untuk menemukan referensi fungsi pada saat kompilasi. Nantinya kita akan melihat lebih jauh bagaimana membuat library dengan perintah  ar. Untuk sederhananya, hanya librari-librari statik saja yang akan kita bahas di kesempatan ini.
Library sistem standar biasanya ditemukan di direktori ‘/usr/lib’ dan ‘/lib’. Sebagai contoh, library math biasanya disimpan di  file ‘/usr/lib/libm.a’ pada sistem  Unix-like. Deklarasi prototipe yang berhubungaan untuk fungsi-fungsi ini diletakkan pada file header ‘/usr/include/math.h’. File standar C sendiri disimpan di ‘/usr/lib/libc.a’dan berisi fungsi-fungsi yang dispesifikasikan di dalam standar ANSI/ISO C, seperti printf  — librari ini terhubung secara default ke setiap program C.
Berikut adalah contoah program yang melakukan panggilan ke fungsi eksternal  sqrt di librari math ‘libm.a’:

#include <math.h>
#include <stdio.h>
int main (void) {
double x = sqrt (2.0);
printf ("The square root of 2.0 is %f\n", x);
return 0;
 }

Mencoba untuk membuat file eksekutabel dari file sumber itu saja akan membuat kompiler memberikan pesan kesalahan seperti berikut :

$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function `main':
/tmp/ccbR6Ojm.o(.text+0x19):
undefined reference to `sqrt'

Pesan kesalahan itu menunjukkan bahwa referensi ke fungsi sqrt tidak dapat ditemukan tanpa librari math eksternal ‘libm.a’. Fungsi sqrt tidak terdefinisikan di program atau di librari default ‘libc.a’, dan kompiler tidak terhubung ke file ‘libm.a’ kecuali ia dinyatakan dengan jelas. Tampak pula, sebuah file disebutkan dalam pesan kesalahan tersebut, yakni ‘/tmp/ccbR60jm.o’ . Ini adalah file objek sementara yang dibuat oleh kompiler dari file  ‘calc.c’, dalam rangka melakukan proses linking.
Untuk membuat kompiler bisa terhubung ke fungsi sqrt di program utama ‘calc.c’ kita perlu memasukkan library ‘libm.a’. Cara yang mudah tapi tidak praktis untuk melakukan hal ini adalah dengan menyatakannya di baris perintah :

$ gcc -Wall calc.c /usr/lib/libm.a -o calc

Librari ‘libm.a’ berisi file-file objek untuk semua fungsi matematika, seperti sin, cos, exp, log dan sqrt. Linker mencari melalui file ini untuk menemukan file objek yang berisi fungsi sqrt.
Setelah file objek untuk fungsi sqrt ditemukan, program utama dapat dihubungkan dan proses kompilasi akan berhasil membuat file eksekutabel :

$ ./calc
The square root of 2.0 is 1.414214

File eksekutabel berisi kode mesin untuk fungsi utama dan kode mesin untuk fungsi sqrt , setelah menyalinnya dari file objek yang terkait di library ‘libm.a’.
Untuk menghindari penulisan alamat direktori yang panjang di baris perintah, kompiler menyediakan opsi short-cut -l untuk menghubungkan diri ke library. Contohnya dalam baris perintah berikut :

$ gcc -Wall calc.c -lm -o calc

sama dengan perintah sebelumnya yang menuliskan secara lengkap alamat direktori ‘/usr/lib/libm.a’.
Secara umum, opsi kompiler -lNAME akan berupaya untuk menghubungkan file objek dengan sebuah library dengan nama ‘libNAME.a’ pada direktori library standar. Direktori tambahan dapat dispesifikasikan pada opsi di baris perintah dan variabel lingkungannya, yang akan kita bahas berikutya. Sebuah program yang besar biasanya menggunakan banyak opsi -l untuk menghubungkan ke berbagai macam jenis library.
Bersambung …

Be the first to comment

Leave a Reply

Your email address will not be published.


*