• Tidak ada hasil yang ditemukan

Mengenal GCC (GNU Compiler Collection)

GCC adalah kumpulan kompiler-kompiler, termasuk compiler bahasa C, C++, Fortran dan Java.

Beberapa kemampuan GCC antara lain:

2 GCC adalah compiler yang mendukung banyak platforms, termasuk microcontroller.

2 GCC mendukung cross compilation, yaitu program yang di-compile pada satu platform untuk agar dapat dieksekusi pada platform yang lain. Ini sangat berguna untuk sistem embedded.

Pada bahasan ini akan diperkenalkan program yang paling umum digunakan dari GCC yaitu compiler bahasa C.

2.Meng-compile satu file source ke file executable

Berikut ini adalah contoh source code program C yang akan di-compile, nama filenya salam.c :

#include <stdio.h>

int main(int argc, char** arg) { /* mencetak salam */ if(argc > 1) {

fprintf(stdout, "assalamu'alaikum %s\n", arg[1]); }

else {

fprintf(stdout, "assalamu'alaikum\n"); }

}

Maka cara meng-compile-nya menjadi file executable, menggunakan gcc :

bash# gcc salam.c

Perintah ini menghasilkan file a.out, yang dieksekusi dengan cara:

bash# ./a.out fadhilah assalamu'alaikum fadhilah

Apabila diinginkan nama file executable, yang berbeda dapat menggunakan option -o, contoh:

bash# ./salam_ku fadhilah assalamu'alaikum fadhilah

3.Meng-compile ke file object

Dalam praktek sehari-hari, untuk membangun sebuah aplikasi, berbagai fungsi yang

diperlukan oleh aplikasi disimpan pada beberapa file source code. File-file ini biasanya tidak dapat langsung dieksekusi, karena tidak memiliki fungsi main().

Untuk file-file seperti ini maka dilakukan kompilasi ke file object, bukan ke file executable. Berikut ini contoh source code vektor1.c berisi fungsi operasi vektor sederhana:

#include <stdio.h> typedef struct t_vektor { int i;

int j; } vektor;

void vektor_cetak(FILE *out, const vektor* vek) { fprintf(out, "vektor (%d, %d)\n", vek->i, vek->j); }

vektor vektor_tambah(const vektor* v1, const vektor* v2) { vektor h;

h.i = v1->i + v2->i; h.j = v1->j + v2->j; return h;

}

Selanjutnya file tersebut di-compile menggunakan opsi -c :

bash# gcc -c vektor1.c

Maka akan dihasilkan file object vektor1.o

Beberapa file sekaligus dapat di-compile dengan cara yang sama. Misal, ada file vektor1.c , vektor2.c, vektor3.c :

bash# gcc -c vektor1.c vektor2.c vektor3.c

4.Menggunakan file header

Pada kenyataan sehari-hari, file source code yang hanya berisi fungsi (bukan program utama) akan dibagi menjadi sedikitnya 2 file, yaitu file header yang berisi deklarasi fungsi dan file source yang berisi implementasi fungsi. Dapat juga file source dibagi menjadi beberapa file,

misalnya jika dikerjakan oleh programmer yang berbeda.

Pada bahasan ini dicontohkan, file vektor1.c sebelumnya dibagi menjadi 1 file header, yaitu vektor1.h, serta 2 file source code, yaitu vektor1.c dan vektor2.c

Berikut file vektor1.h

#ifndef _VEKTOR_H #define _VEKTOR_H 1 #include <stdio.h> typedef struct t_vektor { int i;

int j; } vektor;

void vektor_cetak(FILE *out, const vektor* v);

vektor vektor_tambah(const vektor* v1, const vektor* v2); #endif /* _VEKTOR_H */

Lebih jauh lagi, header file biasanya disimpan pada direktori tersendiri, dalam contoh ini misalkan vektor1.h disimpan di directori /usr/local/inc_ku/math

bash# mkdir -p /usr/local/inc_ku/math bash# mv vektor1.h /usr/local/inc_ku/math

Dan ini file source vektor1.c:

#include <stdio.h> #include "math/vektor1.h"

void vektor_cetak(FILE *out, const vektor* vek) { /* cetak dg baris baru */

fprintf(out, "vektor (%d, %d)\n", vek->i, vek->j); }

Dan ini file source vektor2.c:

#include <stdio.h> #include "math/vektor1.h"

vektor vektor_tambah(const vektor* v1, const vektor* v2) { vektor h;

h.i = v1->i + v2->i; h.j = v1->j + v2->j;

return h; }

Maka untuk meng-compile vektor1.c menjadi file object, gunakan option -I untuk menginformasikan lokasi file header yang diperlukan kepada compiler :

bash# gcc -I/usr/local/inc_ku -c vektor1.c vektor2.c

Jika ada beberapa header file yang tersimpan di directory yang berbeda, misal di /usr/local dan di /home/local/include maka options -I dapat diulang:

bash# gcc -I/usr/local/inc_ku -I/home/local/include -c vektor1.c vektor2.c

Jika ingin meng-compile semua source code c dalam current directory, dapat juga digunakan *.c sebagai pengganti nama file, sebagai berikut :

bash# gcc -I/usr/local/inc_ku -I/home/local/include -c *.c

5.Linking dari object file menjadi executable

Proses linking diperlukan untuk menghasilkan file executable. Pada bahasa C, file yang executable dihasilkan dari source code yang mendefinisikan fungsi main().

Berikut ini file program utama yang menggunakan kedua fungsi vektor yang ada di vektor1.h, di direktori /usr/local/include/math, nama filenya testv1.c

#include <stdio.h> #include "math/vektor1.h" int main(int argc, char** arg) { vektor v1, v2, v3; v1.i = 10; v1.j = 20; v2.i = 30; v2.j = 40; v3 = vektor_tambah(&v1, &v2); vektor_cetak(stdout, &v1); vektor_cetak(stdout, &v2); vektor_cetak(stdout, &v3); return 0; }

1. Compile source code menjadi file object

bash# gcc -I/usr/local/inc_ku -c vektor1.c vektor2.c testv1.c

2. Link object file menjadi file executable testv1 :

bash# gcc vektor1.o vektor2.o testv1.o -o testv1

3. Eksekusi bash# ./testv1 vektor (10, 20) vektor (30, 40) vektor (40, 60)

6.Menggunakan library

Library adalah kumpulan fungsi-fungsi. Library dibuat agar fungsi-fungsi lebih mudah dipergunakan berulang kali, bahkan untuk program aplikasi yang berbeda.

Berbagai aplikasi terkenal di dunia open source dimudahkan pengembangannya karena ketersediaan library yang handal, misal: library openSSL, openGL, Gzip, PNG, GPG dan sebagainya.

Library tersedia dalam 2 format, yaitu static dan dynamic.

Perbedaan utama terletak pada penggunaanya pada sebuah program:

2 Program yang menggunakan static library, memuat kode mesin dari program itu sendiri dan kode mesin fungsi-fungsi yang berasal dari file object lain, yang digunakan oleh program tersebut

2 Program yang menggunakan dynamic library, hanya memuat referensi ke fungsi-fungsi dari file object lain yang digunakan, disamping tentu saja kode mesin dari program itu sendiri. Dynamic library juga biasa disebut shared library.

6.1.Membuat static library

Dari sekumpulan file object dapat dibuat file static library, berdasarkan konvensi, file library berawalan lib dan berekstensi .a, contoh: libssl.a, libz.a libmath.a, libsocket.a, libvektor.a Static library dibuat menggunakan program ar, yang sebenarnya bukan bagian dari GCC, tapi termasuk diantara produk proyek GNU, Berikut ini cara membuat static library:

bash# ar rc libvektor1.a vektor1.o vektor2.o bash# ranlib libvektor1.a

membuat indeks dari isi file arsip ini, yang merupakan simbol-simbol (antara lain: nama fungsi) yang didefinisikan dalam file object. Oleh ranlib, indeks ini disimpan di dalam file arsip.

6.2.Linking ke static library

Seperti halnya file header, maka file arsip atau file library juga biasa disimpan dalam direktori khusus, misal pada contoh di atas, di direktori /usr/local/lib_ku

bash# mkdir -p /usr/local/lib_ku

bash# mv libvektor1.a /usr/local/lib_ku

Maka jika ingin men-link program utama ke library tersebut, gunakan option -L sebagai berikut:

bash# gcc -I/usr/local/inc_ku -L/usr/local/lib_ku testv1.c -lvektor1 -o testv1

bash# ./testv1

Seperti halnya option -I, maka option -L juga dapat digunakan berulang kali untuk me-link ke direktori library yang lain.

6.3.Membuat dynamic library

Gcc juga dapat digunakan membuat dynamic library. Caranya:

1. Meng-compile source code menjadi object file, dengan menggunakan option -fPIC

untuk menghasilkan file object dengan Position Independence Code (PIC). Contoh:

bash# gcc -I/usr/local/inc_ku -fPIC -c vektor1.c vektor2.c

2. Membuat dynamic library (shared object library) dengan menggunakan option -shared

dan options -o , contoh:

bash# gcc -shared -o libvektor1.so vektor1.o vektor2.o

Maka dihasilkan file libvektor1.so yang merupakan file dynamic library.

Seperti halnya static library, maka file dynamic library juga ditempatkan pada direktori tersendiri, biasanya sama dengan direktori static library, pindahkan library ke directori /usr/local/lib_ku:

bash# cp libvektor1.so /usr/local/lib_ku

6.4.Menggunakan dynamic library

Selanjutnya dynamic library, dapat digunakan oleh program lainnya, dengan menghasilkan file executable, langkahnya :

1. Compile program utama ke file object, selain option -c untuk compile, tambahkan option

-fPIC, karena akan menggunakan dynamic library, contoh:

bash# gcc -I/usr/local/inc_ku -fPIC -c testv1.c

2. Buat executable dengan option -o dan linking dengan ke library (dengan option

-lnama_library) jika diperlukan menambahkan path direktori ke library gunakan option -L, contoh:

bash# gcc -o testv1 -L/usr/local/lib_ku -lvektor1 testv1.o

Selanjutnya file output dapat dieksekusi, lihat bagian berikutnya.

6.5.Menjalankan program yang menggunakan dynamic library

Untuk menjalankan program yang menggunakan dynamic library, kita perlu menambahkan direktori library yang akan digunakan, ke variabel environment LD_LIBRARY_PATH, sehingga pada saat program dieksekusi, library yang diperlukan dapat ditemukan di LD_LIBRARY_PATH tersebut:

bash# export LD_LIBRARY_PATH=/usr/local/lib_ku:$LD_LIBRARY_PATH bash#./testv1

7.Penutup

Tutorial singkat tentang gcc ini masih jauh dari lengkap, namun demikian diharapkan dapat menjadi titik awal untuk penggunaan yang lebih maksimal.

Berikut ini referensi ke situs-situs yang berhubungan dengan GCC, untuk pembahasan lebih mendalam :

Dokumen terkait