| Editor Login | Register | ||
| > Bilgisayar > Linux |
|
|
| GCC Kullanımı |
GCC her sürümü ile birlikte bir takım eklentiler olmaktadır. Kod:
Yukarıdaki en basit uygulamamızdan başlamış olduk. Şimdi bu uygulamamızı Kod: #gcc ilk.c Bu satırdan sonra uygulama hata yok ise veyahutta uyarı bir mesaj vermeden dosya oluşacaktır. Bu aşamadan sonra artık basit bir uygulamanın derlenmesi işlemi anlaşılmış oldu. Peki ya uygulama içerisinde dışarıdan bir takım kitaplıklar eklenmek istenirse nasıl derlenmelidir. ? Bu aşamada örnek basit uygulamamız üzerinde bir iki ufak değişiklik yapalım; Kod: #include <ncurses.h> int main() { initscr(); getch(); endwin(); printf("bittin"); } 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. Ön bilgi olarak ncurses.h kullanılması durumunda stdio.h kullanılmasına gerek yoktur. Bu uygulamayı aynı şekilde aşağıdaki ilk öğrendiğimiz standart derleme yöntemi ile derleyelim. Kod: # 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 çok tanımlanmamış komut olduğunu hata olarak vermektedir. Aslında bunlar hata değil bunu biliyoruz ancak bu komutlar ncurses kitaplığı içerisindedir. 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 gerçekleştirecektir. Önemli hatırlatma: Uygulamaya eklenecek olan kitaplıklar ve kütüphaneler eğer sistemde standart olan yerlerde mevcut ise ki bu standart yerler nerelerdir. Bu tanım dağıtımlara göre farklılıklar gösterebilir ancak tüm kütüphanelere ait ekleme dizinleri genel olarak /usr/include içindedir. Eğer bu başlık dosyaları farklı bir yerde oldukları belirtilmek istenmesi durumunda farklı bir parametre daha eklemektedir. Kod: # gcc ilk.c -o ilk -I/usr/include -lncurses satırı da aynı şekilde uygulamamızı sorunsuz olarak derleyecektir. Burada uygulamamız içine eklenen başlık dosyalarını araması için standart path dışında /usr/include dizininide eklemiş olduk. Şu aşamadan itibaren ncurses kitaplıklarını uygulamamız içerisine ekleyebiliyoruz ve istedişimiz ncurses komudunu kullanabiliriz. Bunun yanında mysql kitaplıklarını da sisteme katmak istersek uygulamamızı aşağıdaki şekle sokalım; Kod: #include <ncurses.h> #include <mysql.h> int main() { initscr(); getch(); endwin(); printf("bittin"); } 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 sonuç; ilk.c:2:19: mysql.h: No such file or directory neden mysql.h bulamado halbuki -I/usr/include yazdok, peki sistemde ufak bir arama yapalım bakalım doğrumu yazmışız. # 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 içerisinde bulunmaktaymış öyleyse derleme parametresinde bir değişiklik yapalım. # gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses -lmysql ve sonuç başarılı olacaktır. Bu şekilde istendiği kadar kitaplığı uygulamamız içerisine ekleyebiliriz. Eğer aranan uygulama farklı bir dizin içerisinde ise öyleyse -L parametresi ile bu kütüphanenin yolunu tanımlamalıyız. Örnek olarak; # gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -L/usr/local/lib -lncurses -lmysql Aynı şekilde matematik kütüphanesini uygulamamızda kullanacaksak -lm eklemeliyiz. şifreleme algoritmasını kullanacaksak -lcrypt, postgresql için -lpq, thread kullanımı için -lpthread, glib kütüphanesini kullanmak için -lglib, vga kitaplıklarını kullanmak için -lvga örnek olarak verebiliriz. Bu kullanım örnekleri sisteminize kurduğunuz kitaplıkların miktarına göre değişmektedir. şimdide GCC ile kullanabileceğimiz bir takım parametrelere gelelim. -m parametresi CPU seçimli olara derleme işlemini gerçekleştirmektedir. 386 komut seti için -m386 486 komut seti için -m486 pentium komut seti için -mpentium parametresi verilmelidir. Örnek olarak; # gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses -lmysql -mpentium komutu sonrası uygulama pentium işlemci için derlenmiş olacaktır. 486 seçimli derleme işleminden sonra özellikle büyük uygulamalardan sonra kodda bir miktar büyüme olabilir ancak bu hız ile ters orantılı olarak artırmaktadır. Diğer önemli bir kullanım şekli uygulamaya eklenmiş olan kitaplıkları statik olarak uygulama içerisine eklemektir. Bu şekilde uygulama çalıþtırılabilir kod içerisine kitaplıklarda eklenecektir. Bu işlemi örnek uygulamamız içerisinde deneyelim; Kod: # gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lncurses -lmysql -mpentium -static Her iki farklı derleme şeklinden sonra uygulamanın büyüklüğüne dikkat ediniz, büyüklüğünde epey bir fark olduðu görülecektir. Uygulama içerisinde verilen hata mesajları haricinde bir takım uyarı mesajları bulunmaktadır. Örnek olarak göstereceğimiz var olan değişkenin tanımlanmış olmasına rağmen kullanılmaması gibi; Uygulama içerisinde bir değişken tanımlayalım ve derleyelim; Derleme parametresine ek olarak -Wall parametresini ekleyelim. Kod: 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ı çıkmaya başlayacaktır. Eğer uygulama içerisinde optimizasyon yapılmasına önem verilmesi durumunda bu gereksiz olan değişkenler temizlenmelidir. -w parametresi ile birlikte tüm uyarı mesajlarının ekrana çıkmasına mani olunur. GCC aynı zamanda kendi içerisinde yazılmış olan kodlar üzerinde optimizasyon yapmaktadır. Bu amaçla -O parametresi kullanılmaktadır. Örnek uygulamamızı aşağıdaki şekilde derleyelim. Kod: # gcc ilk.c -o ilk -I/usr/include -I/usr/include/mysql -lcurses -O1 Bu parametre -O0, -O1, -O2, -O3 değerlerini alabilir. 0 hiç optimize yaptırmazken 3 en optimize hali ile uygulama kodunu düzenler. Burada dikkat edilecek olan husus uygulama içerisinde optimize komutları arttıkça seg_fault verme ihtimali de yükselebilir zira uygulama içinde farklı kitaplıklar kullanılması ve kitaplıkların global değişkenler ile kullanılması durumunda bir takım sorunlar oluşturulabilir. |
|
| Bağlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |