Prilaku tradisional dari linker adalah mencari fungsi eksternal dari kiri ke kanan pada library yang diberikan di baris perintah. Ini berarti bahwa suatu library yang berisi definisi dari sebuah fungsi sebaiknya ditempatkan sebelum file-file sumber atau file-file objek saat mengetikkan suatu baris perintah kompilasi. Ini termasuk library yang dispesifikasikan dengan opsi short-cut -l, seperti ditunjukkan pada baris berikut ini :

$ gcc -Wall calc.c -lm -o calc (urutan yang tepat)

Dengan beberapa linker yang ditempatkan terbalik, (menempatkan opsi -lm sebelum file yang menggunakannya) akan memunculkan error :

$ cc -Wall -lm calc.c -o calc (incorrect order) 
main.o: In function `main': 
main.o(.text+0xf): 
undefined reference to `sqrt'

Karena tidak ada file library atau objek yang berisi sqrt setelah ‘calc.c’. Opsi  -lm seharusnya ditempatkan setelah file ‘calc.c’.

Ketika beberapa library digunakan, konvensi yang sama seharusnya diikuti bagi tiap-tiap library. Sebuah library yang memakai fungsi eksternal yang didefinisikan di library lain mesti ditempatkan sebelum library yang berisi fungsi yang ingin digunakan.

Sebagai contoh, sebuah program ‘data.c’ menggunakan library GNU Linear Programming ‘libglpk.a’, yang nanti akan menggunakan library math ‘libm.a’, mestinya dikompilasi dengan urutan sebagai berikut :

$ gcc -Wall data.c -lglpk -lm

dikarenakan file objek ‘libglpk.a’ menggunakan fungsi yang didefinisikan di ‘libm.a’.

Kebanyakan linker yang ada saat ini akan mencari semua library, mengabaikan urutannya, tetapi dikarenakan beberapa linker tidak dapat melakukan hal tersebut, hal terbaik adalah mengikuti aturan pengurutan library dari kiri ke kanan.

Pengetahuan ini baik untuk diingat jika suatu saat anda menemukan masalah yang tidak diharapkan padahal semua library yang dibutuhkan sudah anda cantumkan di baris perintah yang anda buat.

Bersambung (rezaervani@gmail.com)

Serial Sebelumnya

.
.