Minggu, 20 Desember 2015

Membuat Shared Library


Tutorial ini untuk programmer Linux. Programmer Windows mungkin harus baca tentang Dynamic Link Library di link ini.

Jika di Windows kita mengenal file DLL(Dinamic Link Library), maka di Linux kita mengenal file serupa, yang disebut shared library. Dalam shared library biasanya diisi fungsi-fungsi penting yang bisa digunakan oleh program. Penggunaan shared library selama ini dikenal sangat berguna dalam arsitektur sistem pada masa kini.

Saya telah sekian lama mengamati, programmer di Indonesia terlalu serius mempelajari bagaimana membuat program, tanpa mempelajari seluk-beluknya. Program yang dibuat umumnya hanya single executable. Atau, jika tidak begitu, paling tidak mereka telah mencoba menggunakan library eksternal yang dihadirkan bersama program mereka.

Tidak mengherankan jika kontribusi Indonesia dalam dunia pengembangan software tidak begitu nampak. Hal ini karena programmer Indonesia kurang aktif mengembangkan hal yang dapat bermanfaat bagi orang lain, salah satunya library. Meskipun kita selama ini hanya aktif dalam mengembangkan program, akan lebih baik jika mulai sekarang kita memisahkan sebagian kode dan membutnya dalam bentuk library. Selanjutnya bagikan library tersebut untuk programmer lain.

Apa gunanya?
Kenapa kita harus membuat shared library. Dari perspektif saya, saya dapat membedakan 2 alasan seseorang dalam membuat shared library, yaitu:
1. Memiliki lebih dari 1 proyek software. Dengan membuat libary yang sama untuk setiap program yang berbeda akan membuat pengembangan setiap proyek semakin mudah.
2. Ingin berbagi dengan programmer lain. Contoh proyek aplikasi yang turut membagikan librarynya adalah adalah eSpeak, VLC dan FFMPEG. Namun jika diamati lebih jauh, umumnya alasan ini hanya brorientasi untuk pengembangan library saja, contohnya SQLite dan MPG123.

Membuat Shared Library
Membuat shared library tidak jauh berbeda dengan membuat program biasa, hanya saja ada beberpa hal yang perlu diperhatikan dan diketahui. Pertama-tama kita harus membuat kumpulan fungsi library dalam source code, pisahkan deklarasi struct, typedef, include dan buat deklarasi prototype semua fungsi ke dalam sebuah file header. Format file header sebaiknya dibuat seperti ini.
#ifndef __MYLIB_H__
    #define __MYLIB_H__
    #ifdef __cplusplus
    extern "C"
    {
    #endif
     //Tulis header disini
    #ifdef __cplusplus
    }
    #endif
#endif


Penjelasannya adalah sebagai berikut,
di bagian paling atas kita harus memeriksa apakah header ini sudah di-include. Tujuannya adalah agar tidak terjadi kesalahan karena header di-include lebih dari satu kali secara tidak sengaja.
#ifndef __MYLIB_H__
    #define __MYLIB_H__
    ...
#endif


Selanjutnya, anda perlu tahu bahwa kode ini ditulis khusus untuk C, sehingga jika digunakan pada C++, kita harus mengapit kode seperti ini.
extern "C"
{
    ...
}


Tapi kita tidak ingin repot. Kita tidak ingin membuat library dengan 2 syntax yang berbeda. Jadi kita gunakan saja direktif agar compiler menentukan sendiri apakah baris kode seperti diatas perlu disertakan atau tidak. Direktifnya seperti ini.
    #ifdef __cplusplus
    extern "C"
    {
    #endif
        …
        …
    #ifdef __cplusplus
    }
    #endif


OK, kita sudah tahu bagaimana membuat header. yang baik. Sekarang kita hanya tinggal menulis beberapa baris kode untuk membuat shared library kita yang pertama.
 
mylib.h
#ifndef __MYLIB_H__
#define __MYLIB_H__
#ifdef __cplusplus
extern "C"
{
#endif

typedef struct{
    int a;
    int b;
} ab;

void set_a(ab*, int);
void set_b(ab*, int);
int get_ab(ab*);
void print_ab(ab*);

#ifdef __cplusplus
}
#endif
#endif


mylib.c
#include <stdio.h>
#include "mylib.h"

void set_a(ab *s, int num){
    s->a = num;
}

void set_b(ab *s, int num){
    s->b = num;
}

int get_ab(ab* s){
    return s->a + s->b;
}

void print_ab(ab* s){
    int total = s->a + s->b;
    printf("A + B = %d\n", total);
}


build source tersebut menjadi library dengan perintah seperti ini.
gcc -shared -o mylib.so mylib.c

Menggunakan Shared Library dalam Program
Shared library yang sudah jadi bisa digunakan dengan mudah, hanya dengan meng-include header, sebelum menggunakan fungsi-fungsi di dalamnya. Contohnya seperti ini.

mylib_test.c
#include "mylib.h"

ab mydata;

int main()
{
    set_a(&mydata,10);
    set_b(&mydata,5);
    print_ab(&mydata);
}


build source code demonstrasi ini dengan perintah berikut.
gcc -o mylib_test mylib_test.c mylib.so

Hasil
Windows secara otomatis mencari shared library DLL di folder program dan folder system. Namun, di sistem linux, shared library harus berada dalam direktory /lib. Jadi, sebelum menjalankan mylib_test, copy mylib.so ke dalam folder /lib.
cp mylib.so /lib/mylib.so

Dan, beginilah hasilnya ketika kita mengeksekusinya dari terminal :)
it@it:~$ ./mylib_test
A + B = 15
it@it:~$


Sudah, mudah bukan? sekarang pilihan anda untuk memnentukan apakah library yang anda buat harus dibagikan ke orang lain secara open source atau closed source. Itu pilihan anda, tapi, sebelum berpikir jauh kesana, mungkin anda perlu membuat library dulu :D
Load disqus comments

0 comments