ailesine eklenmiştir. Bu konuda bilgi icin ;
http://en.wikipedia.org/wiki/GNU_Compiler_Collection adresine bir ziyaret yapılabilir. http://gcc.gnu.org/ adresinden GCC son surumleri takip edebilirsiniz. GCC surumunuzu oğrenmek icin;bash-2.05b# gcc -v
Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/3.2.2/specs
Configured with: ../gcc-3.2.2/configure --prefix=/usr --enable-shared
--enable-threads=posix --enable-__cxa_atexit --disable-checking --withgnu-
ld --verbose --target=i386-slackware-linux --host=i386-slackwarelinux
Thread model: posix
gcc version 3.2.2
Benim sistemimde donen sonuc yukarıdaki şekildedir.
Derleyicinin uygulamaları doğru bir şekilde derlemesi icin bir takım
parametrelerin doğru olarak verilmesi gerekmektedir. En basit şekli
ile uygulamamızı yazalım ve ilk derleme işlemimize gecelim.
#include
int main()
{
printf("Örnek uygulama");
}
Yukarıdaki en basit uygulamamızdan başlamış olduk. Şimdi bu uygulamamızı derlemeye gecelim. Uygulamayı istediğimiz bir editor ile yazdıktan sonra ilk.c olarak kayededelim ve aşağıdaki satırları yazalım.#gcc ilk.c
Bu satırdan sonra uygulamada hata yok ise veya bir uyarı mesajı vermezse uygulam derlenir. Kaynak kodun olduğu dizine bakıldığı zaman a.out isimli bir dosyanın oluştuğu gorulecektir. Uygulamamızı bir isim vermeden derledik bu gibi durumlarda gcc varsayılan olarak a.out dosya adını kullanacaktır. Şimdide uygulamamızı kendi ismiyle derleyelim. Bu amacla -o parametresi kullanılacaktır. -o parametresi cıkış dosya adını belirtmektedir.#gcc ilk.c -o ilk
Komut satırından sonra ilgili dizin icerisinde artık bir ilk isimli calıştırılabilir dosya
oluşacaktır. Bu aşamadan sonra artık basit bir uygulamanın derlenmesi işlemi anlaşılmış
oldu. Peki ya uygulama icerisinde dışarıdan bir takım kitaplıklar eklenmek istenirse nasıl
M.Ali VARDAR 2003-2005 – GCC Kullanımıderlenmelidir? Bu aşamada ornek basit uygulamamız uzerinde bir iki ufak değişiklik
yapalım;
#include
int main()
{
initscr();
getch();
endwin();
printf("bitti\n");
}
Standart kitaplıklar kullanıldığı zaman getch() fonksiyonu yoktur. Ancak eğer ncurses kullanılması durumunda bu komut mevcuttur. Dikkat edilecek olursa stdio.h uygulamaya eklenmedi. On bilgi olarak ncurses.h kullanılması durumunda stdio.hkullanılmasına gerek yoktur. Bu uygulamayı aynı şekilde aşağıdaki ilk oğrendiğimiz
standart derleme yontemi ile derleyelim.
# gcc ilk.c -o ilk
/tmp/cchah5Wx.o: In function `main':
/tmp/cchah5Wx.o(.text+0x7): undefined reference to `initscr'
/tmp/cchah5Wx.o(.text+0x10): undefined reference to `stdscr'
/tmp/cchah5Wx.o(.text+0x15): undefined reference to `wgetch'
/tmp/cchah5Wx.o(.text+0x1d): undefined reference to `endwin'
collect2: ld returned 1 exit status
GCC bize bir cok tanımlanmamış komut olduğunu hata olarak vermektedir. Aslında
bunlar hata değil bunu biliyoruz ancak bu komutlar ncurses kitaplığı icerisindedir. Bizim
yapmamız gereken ncurses kitaplığının bayrağını derleme parametresine eklemek
olacaktır.
# gcc ilk.c -o ilk -lncurses
Bu komuttan sonra uygulama hata vermeden derleme işlemini gercekleştirecektir. Onemli
hatırlatma, uygulamaya eklenecek olan kitaplıklar ve kutuphaneler eğer sistemde standart
olan yerlerde mevcut ise ki bu standart yerler nerelerdir. Bu tanım dağıtımlara gore
farklılıklar gosterebilir ancak tum kutuphanelere ait ekleme dizinleri genel olarak
/usr/include icindedir. Eğer bu başlık dosyaları farklı bir yerde oldukları belirtilmek istenmesi durumunda farklı bir parametre daha eklemektedir.# gcc ilk.c -o ilk -I/usr/include -lncurses
satırı da aynı şekilde uygulamamızı sorunsuz olarak derleyecektir. Burada uygulamamız icine eklenen başlık dosyalarını araması icin standart path dışında /usr/include dizinini de eklemiş olduk. Şu aşamadan itibaren ncurses kitaplıklarını uygulamamız icerisine ekleyebiliyoruz ve istediğimiz ncurses komutlarını kullanabiliriz. Bunun yanında mysql kitaplıklarını da uygulamaya katmak istersek uygulamamızı aşağıdaki şekle sokalım; M.Ali VARDAR 2003-2005 – GCC Kullanımı#include
#include
int main()
{
initscr();
getch();
endwin();
printf("bitti\n");
}
En son derleme satırımız ile derleyelim. Aynı zamanda -lmysql ile mysql kitaplıklarını kullanacağımızı belirtelim.# gcc ilk.c -o ilk -I/usr/include -lncurses -lmysql
ve sonuc;
ilk.c:2:19: mysql.h: No such file or directory
neden mysql.h bulamadı halbuki -I/usr/include yazdık, peki sistemde ufak bir arama yapalım bakalım doğrumu yazdık?# locate mysql.h
/usr/share/apps/quanta/doc/php/ref.mysql.html
/usr/include/mysql/mysql.h
işte aradığımız satır. mysql.h dosyası /usr/include/mysql dizini icin de bulunmakta imiş oyleyse derleme parametresinde bir değişiklik yapalım.# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses -lmysql
ve sonuc başarılı olacaktır. Bu şekilde istendiği kadar kitaplığı uygulamamız icerisine ekleyebiliriz. Eğer aranan uygulama farklı bir dizin icerisinde ise oyleyse -L parametresi ile bu kutuphanenin yolunu tanımlamalıyız. Ornek olarak;# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -L/usr/local/lib
-lncurses -lmysql
Aynı şekilde matematik kutuphanesini uygulamamızda kullanacaksak -lm eklemeliyiz. şifreleme algoritmasını kullanacaksak -lcrypt, postgresql icin -lpq, thread kullanımı icin -lpthread, glib kutuphanesini kullanmak icin -lglib, vga kitaplıklarını kullanmak icin -lvga ornek olarak verebiliriz. Bu kullanım ornekleri sisteminize kurduğunuz kitaplıkların miktarına gore değişmektedir. Şimdide GCC ile kullanabileceğimiz bir takım parametrelere gelelim. -m parametresi CPU secimli olara derleme işlemini gercekleştirmektedir. 386 komut seti icin -m386 486 komut seti icin -m486 pentium komut seti icin -mpentium parametresi verilmelidir. Ornek olarak;# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses
-lmysql -mpentium
M.Ali VARDAR 2003-2005 – GCC Kullanımıkomutu sonrası uygulama pentium işlemci icin derlenmiş olacaktır. 486 secimli derleme
işleminden sonra ozellikle buyuk uygulamalardan sonra kodda bir miktar buyume
olabilir, ancak bu hız ile ters orantılı olarak artırmaktadır. Diğer onemli bir kullanım şekli
uygulamaya eklenmiş olan kitaplıkları statik olarak uygulama icerisine eklemektir. Bu
şekilde uygulama calıttırılabilir kod icerisine kitaplıklarda eklenecektir. Bu işlemi ornek
uygulamamız icinde deneyelim;
# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses
-lmysql -mpentium -static
Her iki farklı derleme şeklinden sonra uygulamanın buyukluğune dikkat ediniz, buyukluğunde epey bir fark oldudu gorulecektir. Uygulama icerisinde verilen hata mesajları haricinde bir takım uyarı mesajları bulunmaktadır. Ornek olarak gostereceğimiz var olan değişkenin tanımlanmış olmasına rağmen kullanılmaması gibi; Uygulama icerisinde bir değişken tanımlayalım ve derleyelim; Derleme parametresine ek olarak -Wall parametresini ekleyelim.gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lcurses -Wall
ilk.c: In function `main':
ilk.c:5: warning: unused variable `a'
ilk.c:10: warning: control reaches end of non-void function
aşağıdaki şekilde karşımıza uyarı mesajları cıkmaya başlayacaktır. Eğer uygulama icerisinde optimizasyon yapılmasına onem verilmesi durumunda bu gereksiz olan değişkenler temizlenmelidir. -w parametresi ile birlikte tum uyarı mesajlarının ekrana cıkmasına engel olunur. GCC aynı zamanda kendi icerisinde yazılmış olan kodlar uzerinde optimizasyon yapmaktadır. Bu amacla -O parametresi kullanılmaktadır. Ornek uygulamamızı aşağıdaki şekilde derleyelim.# gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lcurses -O1
Bu parametre -O0, -O1, -O2, -O3 değerlerini alabilir. 0 hic optimize yaptırmazken 3 en optimize hali ile uygulama kodunu duzenler. M.Ali VARDARali@linuxprogramlama.com
Bu yazınınson şekliniwww.linuxprogramlama.com adresinden temin edebilirsiniz. Yasal Açıklama: Bu belgenin, [GCC Kullanımı]1.0 sürümünün telif hakkı© 2005 M. Ali Vardar'a aittir. Bu belgeyi, Free Software Foundation tarafından yayınlanmışbulunan GNU Özgür Belgeleme Lisansının1.1 ya da daha sonraki sürümünün koşullarınabağlıkalarak kopyalayabilir, dağıtabilir ve/veya değiştirebilirsiniz. Bu Lisansınbir kopyasınıhttp://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz. BU BELGE "ÜCRETSİZ"OLARAK RUHSATLANDIĞI İÇİN,İÇERDİĞİBİLGİLERİÇİN İLGİLİKANUNLARIN İZİNVERDİĞİÖLÇÜDE HERHANGİBİRGARANTİ VERİLMEMEKTEDİR.AKSİYAZILI OLARAK BELİRTİLMEDİĞİMÜDDETÇE TELİF HAKKI SAHİPLERİVE/VEYA BAŞKA ŞAHISLAR BELGEYİ"OLDUĞU GİBİ",AŞİKAR VEYA ZIMNEN, SATILABİLİRLİĞİVEYA HERHANGİBİRAMACA UYGUNLUĞU DA M.Ali VARDAR 2003-2005 – GCC Kullanımı DAHİLOLMAK ÜZERE HİÇBİRGARANTİVERMEKSİZİNDAĞITMAKTADIRLAR. BİLGİNİNKALİTESİİLEİLGİLİTÜM SORUNLAR SİZEAİTTİR.HERHANGİBİR HATALI BİLGİDENDOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİRVEYA DÜZELTME MASRAFLARI SİZEAİTTİR.İLGİLİKANUNUN İCBAR ETTİĞİ DURUMLAR VEYA YAZILI ANLAŞMA HARİCİNDEHERHANGİBİRŞEKİLDE TELİF HAKKI SAHİBİVEYA YUKARIDA İZİNVERİLDİĞİŞEKİLDE BELGEYİDEĞİŞTİREN VEYA YENİDEN DAĞITAN HERHANGİBİRKİŞİ,BİLGİNİNKULLANIMI VEYA KULLANILAMAMASI (VEYA VERİKAYBI OLUŞMASI, VERİNİNYANLIŞ HALE GELMESİ,SİZİNVEYA ÜÇÜNCÜ ŞAHISLARIN ZARARA UĞRAMASI VEYA BİLGİLERİNBAŞKA BİLGİLERLE UYUMSUZ OLMASI) YÜZÜNDEN OLUŞAN GENEL, ÖZEL, DOĞRUDAN YA DA DOLAYLI HERHANGİBİRZARARDAN, BÖYLE BİR TAZMİNAT TALEBİTELİFHAKKI SAHİBİVEYA İLGİLİKİŞİYEBİLDİRİLMİŞOLSA DAHİ,SORUMLU DEĞİLDİR. Tüm telif haklarıaksi özellikle belirtilmediği sürece sahibine aittir. Belge içinde geçen herhangi bir terim, bir ticari isim ya da kuruma itibar kazandırma olarak algılanmamalıdır.Bir ürün ya da markanınkullanılmışolmasıona onay verildiği anlamında görülmemelidir

Downloads





