GCC Compiler adalah compiler C yang sangat kuat dan populer untuk berbagai distribusi Linux. Artikel ini menjelaskan beberapa opsi compiler GCC yang populer.
Contoh Kode C
Berikut kode C dasar (main.c) yang akan digunakan dalam artikel ini :
#include<stdio.h> int main(void) { printf("\n The Geek Stuff\n"); return 0; }
Opsi Kompilator GCC
1. Tentukan Nama Output yang Dapat Dieksekusi
Dalam bentuknya yang paling dasar, compiler gcc dapat digunakan sebagai :
gcc main.c
Perintah di atas mengeksekusi proses kompilasi lengkap dan mengeluarkan executable dengan nama a.out.
Gunakan opsi -o, seperti yang ditunjukkan di bawah ini, untuk menentukan nama file keluaran untuk yang dapat dieksekusi.
gcc main.c -o main
Perintah di atas akan menghasilkan file output dengan nama 'main'.
Untuk memahami proses kompilasi lengkap dari kompiler GCC, baca artikel kami Perjalanan Program C ke Linux yang Dapat Dieksekusi dalam 4 Tahap.
2. Aktifkan semua peringatan yang disetel melalui opsi -Wall
Opsi ini mengaktifkan semua peringatan di GCC.
#include<stdio.h> int main(void) { int i; printf("\n The Geek Stuff [%d]\n", i); return 0; }
Jika kode di atas dikompilasi, peringatan berikut terkait dengan variabel yang tidak diinisialisasi i dihasilkan:
$ gcc -Wall main.c -o main main.c: In function ‘main’: main.c:6:10: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
3. Hanya menghasilkan output praprosesor dengan opsi -E
Output dari tahap preprocessing dapat dihasilkan dengan menggunakan opsi -E.
$ gcc -E main.c > main.i
Perintah gcc menghasilkan output pada stdout sehingga Anda dapat mengarahkan output dalam file apa pun. Dalam kasus kami (di atas), file main.i akan berisi output yang telah diproses sebelumnya.
4. Hanya menghasilkan kode perakitan menggunakan opsi -S
Output tingkat perakitan dapat diproduksi menggunakan opsi -S.
gcc -S main.c > main.s
Dalam hal ini, file main.s akan berisi keluaran assembly.
5. Hasilkan hanya kode yang dikompilasi menggunakan opsi -C
Untuk menghasilkan hanya kode yang dikompilasi (tanpa tautan apa pun), gunakan opsi -C.
gcc -C main.c
Perintah di atas akan menghasilkan file main.o yang akan berisi kode level mesin atau kode yang dikompilasi.
6. Hasilkan semua file perantara menggunakan fungsi -save-temps
Opsi -save-temps dapat melakukan semua pekerjaan yang dilakukan pada contoh 4,5 dan 6 di atas. Melalui opsi ini, output pada semua tahapan kompilasi disimpan di direktori saat ini. Harap perhatikan bahwa opsi ini juga menghasilkan yang dapat dieksekusi.
Misalnya :
$ gcc -save-temps main.c $ ls a.out main.c main.i main.o main.s
Jadi kita melihat bahwa semua file perantara serta executable akhir dihasilkan dalam output.
7. Tautkan dengan perpustakaan bersama menggunakan opsi -l
Opsi -l dapat digunakan untuk menautkan dengan pustaka bersama. Misalnya:
gcc -Wall main.c -o main -lCPPfile
Perintah gcc yang disebutkan di atas menautkan kode main.c dengan pustaka bersama libCPPfile.so untuk menghasilkan 'main' akhir yang dapat dieksekusi.
8. Buat kode posisi independen menggunakan opsi -fPIC
Saat membuat pustaka bersama, kode independen posisi harus dibuat. Ini membantu perpustakaan bersama untuk dimuat sebagai alamat apa pun alih-alih beberapa alamat tetap. Untuk opsi -fPIC ini digunakan.
Misalnya, perintah berikut membuat pustaka bersama libCfile.so dari file sumber Cfile.c:
$ gcc -c -Wall -Werror -fPIC Cfile.c $ gcc -shared -o libCfile.so Cfile.o
Jadi kami melihat bahwa opsi -fPIC digunakan dalam pembuatan pustaka bersama.
9. Cetak semua perintah yang dieksekusi menggunakan opsi -V
Opsi -v dapat digunakan untuk memberikan informasi verbose tentang semua langkah yang dilakukan gcc saat mengompilasi file sumber.
Misalnya :
$ gcc -Wall -v main.c -o main Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper Target: i686-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu Thread model: posix gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ... ... ...
Jadi kami melihat bahwa informasi rinci dihasilkan dalam output.
10. Aktifkan dukungan program ISO C89 menggunakan opsi -ansi
Melalui opsi -ansi, dukungan untuk gaya ISO C89 diaktifkan.
Perhatikan kode berikut :
#include<stdio.h> int main(void) { // Print the string printf("\n The Geek Stuff\n"); return 0; }
Jika kode di atas dikompilasi dengan opsi -ansi maka gcc akan menghasilkan kesalahan karena komentar C++ tidak diperbolehkan dalam gaya ISO C89.
Berikut adalah outputnya :
$ gcc -Wall -ansi main.c -o main main.c: In function ‘main’: main.c:5:3: error: expected expression before ‘/’ token
Jadi kami melihat bahwa gcc melontarkan kesalahan terkait gaya berkomentar.
11. Menafsirkan char sebagai unsigned char menggunakan opsi -funsigned-char
Melalui opsi ini, tipe karakter diperlakukan sebagai tipe yang tidak ditandatangani.
Ini contohnya :
#include<stdio.h> int main(void) { char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
Ketika kode di atas dikompilasi dengan opsi funsigned-char, berikut adalah outputnya :
$ gcc -Wall -funsigned-char main.c -o main $ ./main The Geek Stuff [246]
Jadi kita melihat bahwa char memang diperlakukan sebagai unsigned.
12. Menafsirkan char sebagai char yang ditandatangani menggunakan opsi -fsigned-char
Ini adalah kebalikan dari apa yang kita bahas pada (12) di atas. Dengan menggunakan tanda ini, variabel char diperlakukan sebagai tanda.
Ini contohnya :
$ gcc -Wall -fsigned-char main.c -o main $ ./main The Geek Stuff [-10]
Outputnya mengonfirmasi bahwa char diperlakukan sebagai yang ditandatangani.
13. Gunakan makro waktu kompilasi menggunakan opsi -D
Opsi kompiler D dapat digunakan untuk mendefinisikan makro waktu kompilasi dalam kode.
Ini contohnya :
#include<stdio.h> int main(void) { #ifdef MY_MACRO printf("\n Macro defined \n"); #endif char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
Opsi kompiler -D dapat digunakan untuk mendefinisikan makro MY_MACRO dari baris perintah.
$ gcc -Wall -DMY_MACRO main.c -o main $ ./main Macro defined The Geek Stuff [-10]
Cetakan yang terkait dengan makro dalam output mengonfirmasi bahwa makro telah ditentukan.
14. Ubah peringatan menjadi kesalahan dengan opsi -Werror
Melalui opsi ini, peringatan apa pun yang dapat dilaporkan gcc akan diubah menjadi kesalahan.
Ini contohnya :
#include<stdio.h> int main(void) { char c; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
Kompilasi kode di atas akan menghasilkan peringatan terkait dengan variabel tidak terdefinisi c dan ini akan diubah menjadi kesalahan dengan menggunakan opsi -Werror.
$ gcc -Wall -Werror main.c -o main main.c: In function ‘main’: main.c:7:10: error: ‘c’ is used uninitialized in this function [-Werror=uninitialized] cc1: all warnings being treated as errors
15. Berikan opsi gcc melalui file menggunakan opsi @
Opsi untuk gcc juga dapat diberikan melalui file. Ini dapat dilakukan dengan menggunakan opsi @ diikuti dengan nama file yang berisi opsi. Lebih dari satu opsi dipisahkan oleh spasi.
Ini contohnya :
$ cat opt_file -Wall -omain
Opt_file berisi opsi.
Sekarang kompilasi kode dengan menyediakan opt_file bersama dengan opsi @.
$ gcc main.c @opt_file main.c: In function ‘main’: main.c:6:11: warning: ‘i’ is used uninitialized in this function [-Wuninitialized] $ ls main main
Output mengonfirmasi bahwa file opt_file telah diurai untuk mendapatkan opsi dan kompilasi telah dilakukan.