Yazdır
Kategori: Dersler
Gösterim: 2061

GCC ÖZET

GCC NEDIR
GCC (GNU Compiler Collection) özellikle açık kaynaklı programların geliştirilmesi için kullanılan derleyiciler kolleksiyonudur.
İlk olarak UNIX deki CC(C Compiler) derleyicisinin görevini yapmak için üretildi. O zaman GCC kısaltamsı Gnome C Compiler dan geliyordu zamanla kısaltma aynı kalsada içeriği değişti.


DERLEYİCİ NEDİR
Bir derleyici belirli bir programlama dili ile yazılmış bilgisayar kodlarını makinaya bağımlı olan sıfırlar ve birler ile ifade edilen işlemcinin anlayabileceği komut setlerine çevirir. Bu kodlar işletim sistemi tarafından icra edilebilir.
Derleyci yazılmış program kodlarını ilk önce yapısal olarak inceler ve bileşenlerine ayırır daha sonra kullanılan programlama diline göre daha detaylı bir şekilde bilgisayara daha yakın bir alt seviyeye göre veri oluşturur. Daha sonra bir ağaç yapısı şeklinde bu bilgileri çıktı haline getirir. Bu bilgi ön makina dili diyebileceğimiz RTL(Register Transfer Language)
olarak adlandırılan dile aktarır.Bu aşamadan sonra RTL verisi üzerinde optimizasyon yapar. Hedef makina için Assemblye diline çevrilir. Assembler
bu kodu kullanarak üzerinde referanslanmamış bağlantıların bulunduğu bir nesne kodu oluşturur. Bu kodda uygulama kodları bulunsada henüz çalıştırılabilir bir şekilde değildir. Bağlayıcı (Linker) bu dosyaları bağlayarak esas çalıştırılabilir program dosyasını oluşturur.

Derleyiciler bir çok dil için yazılmış olabileceğinden bu işlemleri yapan parser kısmı her dil için
farklı çalışabilir.
GCC de C,C++,Java,Fortran,Ada gibi programlama dilleri destekleniyor.

KURULUMDA GELEN DOSYALAR
c++ g++ ile aynı
cc1 C derleyicisi
cc1plus C++ derleyicisi
collect2
configure
crt0.o
cygwin.dll
f77
f771
g++ Ön tanımlı dil olarak C++ dilini ayarlar ve
standart C++ kütüphanelerini ekler ve bağlar

gcc Ana program bu uygun dili ve gerekli seçenekleri ayarlar

gcj Java kodlarını derlemek için kullanılır
gnat1
gnatbind
gnatlink
jc1 Java derleyicisi.
libgcc
libgcj
libstdc++

Yardımcı dosyalar

addr2line
ar GNU arşiv oluşturma dosyası
as GNU assembler
autoconf
c++filt
f2c
gcov
gdb GNU debugger
GNATS
gprof
ld GNU Linker
libtool
make makefile dosyalarını okuyarak derleme yapmasını sağlar.
nlmconv
nm Bir nesne dosyasının içerisindeki sembolleri okur
objcopy
ranlib
ratfor
readelf
size
strip Bu program debug için gerekli olan bilgilerin nesne dosyadan silinmesini sağlar
vcg
windres Windows kaynak dosyası için derleyici.

GCC NEREDE KULLANILIR


GCC KULLANIMI
options
gcc ye komut satirindan verdigimiz parametrelerdir sirasini değistirebiliriz.
Örnek
gcc main.c

Bu sekilde programimizi derledigimiz zaman oluşun dosya windows ortaminda gcc dizininde a.exe dosyasinda olusur. Yine olusan dosyanin ismi ve nerede olusacagini ek seçeneklerle belirleriz.
C DERLEYİCİSİNİN KULLANIMI

Derleyicinin tanıdığı dosyalar.

 

Dosya uzantısı

Açıklama

.a

Statik kütüphane

.c

C dili kaynak kodu

.h

C dili başlık dosyası

.i

Önişlemlemeden geçmeyen veya geçmesine gerek olmayan c kaynak kodlu dosya. Bu dosya derlemenin ileri aşamalarında oluşturuluyor.

.o

Nesne dosyası. Bağlayıcı(linker) bu dosyaları kullanıyor.

.s

Assembly dili dosyası

.so

Dinamik(paylaşımlı) kütüphane dosyası

 

-o seçenegi
 

Bu seçenek sayesinde dosyamiza isim verebiliriz.

gcc main.c -o program

Yine istediginiz dizinde olusmasi için tam olarak dizin isminide eklemeniz gerekmektedir.

gcc main.c -o "C:\program"

Birden fazla kaynak kod dosyaniz var ise diger dosyalarıda ekleyebilirsiniz.

gcc main.c yan.c -o program


-c seçenegi


Eger bu dosyalari ayri ayri derleyip olusan nesne dosyalari baglayarak icra edilebilir dosyayi olusturmak isterseniz -c seçeneğini kullaniriz.

gcc -c main.c
gcc -c yan.c
gcc main.o yan.o -o program

 

-std seçeneği

 

Bu seçenek ile dil standartlarından birini belirleyebilirsiniz. c89,c99,gnu89,gnu99
gcc -c -std=c99


-ansi seçeneği


C derleyisinin bu standarda göre derlemesini sağlar

 

-traditional seçeneği

En eski C standartı ile derlenmesini sağlar.

-pediatic seçeneği

Sıkı standart uyumluluğu için uyarılar verilmesinis sağlar.

-E seçeneği

Bu seçenek derlemenin yanlızca önişlemleme yaparak sonlanmasını sağlar. Eğer önişlemlenmiş dosyayı kaydetmek isterseniz -o seçeneğini kullanabilirsiniz. Önişlem gerektirmeyen c kaynak kodu dosyasının uzantısı i olduğu için burada i uzantısı vermek daha mantıklıdır.

gcc -E merhabadunya.c -o merhabadunya.i

-S seçeneği

Bu seçenek kaynak koddan assembly diline çevirir.

gcc -S merhabadunya.c

-r ve -l seçeneği

Bu seçenek statik kütüphane oluşturmak için kullanılır. ar programı bu amaç için kullanılır.

merhaba.c dosyamız aşağıdaki gibi olsun.

 

#include "stdio.h"

void mrb()

{

puts("Merhaba Dunya");

}

 

bekle.c dosyamız ise aşağıdaki gibi olsun.
 

#include "stdio.h"

#include "conio.h"

int bekle()

{

getch();

}

 

ana.c dosyası

 

#include <stdio.h>

#include <stdlib.h>

int bekle();

void mrb();

int main()

{

mrb();

bekle();

return 0;

}

 

Bu dosyalarımızı oluşturduktan sonra bekle.c ve merhaba.c dosyalarımızdan bir arşiv dosyası (statik kütüphane) oluşturalım.

 

İlk önce bekle.c ve merhaba.c den nesne (Obje) dosyası oluşturalım.

 

gcc -c bekle.c merhaba.c

 

Bu işlem sonunda merbaha.o ve bekle.o isimli iki obje dosyası oluşur.

Arkasından da as programımız ile arşiv dosyamızı oluşturabilirz.

 

as -r librutin.a bekle.o merhaba.o

 

Böylelikle daha sonra kullanabileceğimiz statik kütüphanemiz librutin.a şeklinde oluşur. Bu dosyayı kullanmak istersek aşağıdaki gibi kullanabiliriz.

 

gcc ana.c librutin.a -o programismi

 

İsimlendirme uyumu için bu tür satik kütüphane dosyları lib harfleri ile başlar var içeriğe göre belirleyeceğiniz isim ile devam eder.

-l seçeneği ile bu şekilde isimlendirilmiş arşiv dosyaları daha kısa şekilde aşağıdaki gibi yazılabilir

 

gcc ana.c -lrutin -o programismi

 

Tabi bu durumda derleyici dosyayı bulmak için sistem dosyaların bulunduğu dizinlere bakacaktır.

 

-shared -fpic seçenekleri

 

Bu seçenekler ile paylaşımlı kütüphane dosyaları oluşturulabilir.

Önceki örnekteki üç adet dosyayı tekrar kullanıyoruz.

İlk önce -fpic komutu ile nesne dosyalarını oluşturuyoruz. Buradaki fpic seçeneği oluşturduğumuz dosyaların bağlantılarının pozisyon bağımsız yapılmasını sağlıyor. Buradaki pic (position independent code) Pozisyon Bağımsız Kod manasına gelmektedir.

 

gcc -fpic -c merhaba.c bekle.c

 

Oluşan iki adet obje dosyasından paylaşımlı kütüphanemizi oluşturuyoruz.

 

gcc -shared merhaba.o bekle.o -o paylasimli.so

 

Aslında direkt olarak da paylaşımlı kütüphanemizi oluşturmamız mümkün. Bunun için

 

gcc -fpic -shared merhaba.c bekle.c -o paylasimli.so

 

yazarak yapabiliriz.

Daha sonra programımızı derlerken bağlamak istediğimiz kütüphaneyide yazarak programımızı oluşturuyoruz.

 

gcc ana.c paylasimli.so -o programismi

 

-xc seçeneği

 

Bu seçenek ile .c uzantısından farklı dosyaları kaynak dosya olarak görmesi sağlanır.

 

gcc -c -xc ana.tlb merhaba.tlb bekle.tlb

 

Bu komut obje dosyaların oluşmasını sağlayacaktır.

 

 

C DİLİ EKLENTİLERİ

 

GCC ye özel c diline eklenmiş bazı özellikler daha önce ilk olarak bu derleyicide kullanılmış

ve standartlaşmıştır. Yine bir çok özellik gcc de vardır ki bu özellikler henüz standartlaşmamıştır. Bu özellikleri kullanmak size kalmıştır. Eğer -ansi gibi bir seçeneği girmemişseniz yani gnu uzantılı standartlardan birini kullanırsanız bu ek özellikleri kullanabilirsiniz.

__alignof__(tip)

 

Berlitilen tip için ayrılacak sınır belleği bayt olarak verir.

 

örnek kullanış

 

#include <stdio.h>

typedef struct {

double dvalue;

int ivalue;

} showal;

int main(int argc,char *argv[])

{

printf(“__alignof__(char)=%d\n”,__alignof__(char));

printf(“__alignof__(short)=%d\n”,__alignof__(short));

printf(“__alignof__(int)=%d\n”,__alignof__(int));

printf(“__alignof__(long)=%d\n”,__alignof__(long));

printf(“__alignof__(long long)=%d\n”,__alignof__(long long));

printf(“__alignof__(float)=%d\n”,__alignof__(float));

printf(“__alignof__(double)=%d\n”,__alignof__(double));

printf(“__alignof__(showal)=%d\n”,__alignof__(showal));

return(0);

}

 

Sıfır Uzunlukta Dizi

 

GNU C değişken uzunlukta yapılar oluşturmak için sıfır uzunlukta dizi kullanabilirsiniz. Bu

sıfır uzunluklu dizinin yapının son elemanı yapılarak sağlanır. Ağağıda bu tekniğin nasıl kullanıldığını görebilirsiniz.

/* zarray.c */

#include <stdio.h>

#include <stdlib.h>

typedef struct {

int size;

char string[0];

} vlen;

int main(int argc,char *argv[])

{

int i;

int count = 22;

char letter = 'a';

vlen *line = (vlen *)malloc(sizeof(vlen) + count);

line->size = count;

for(i=0; i<count; i++)

line->string[i] = letter++;

printf("sizeof(vlen)=%d\n",sizeof(vlen));

for(i=0; i<line->size; i++)

printf("%c ",line->string[i]);

printf("\n");

return(0);

}

Yukarıdaki örnekte yapıdaki size değeri kadar yapınızın boyunu çalışma zamanı arttırabilir ve işlem yapabilirsiniz. Aynı özelliği standart c ile yapmak isterseniz aşağıdaki gibi programlama yapabilirsiniz.

#include <stdio.h>

typedef struct {

int size;

char string[];

} vlen;

vlen initvlen = { 4, { 'a', 'b', 'c', 'd' } };

int main(int argc,char *argv[])

{

int i;

printf("sizeof(vlen)=%d\n",sizeof(vlen));

printf("sizeof(initvlen)=%d\n",sizeof(initvlen));

for(i=0; i<initvlen.size; i++)

printf("%c ",initvlen.string[i]);

printf("\n");

return(0);

}

 

Birleşik Bildiri

 

GCC derleyicisinde bulunan bir özellik sayesinde blocklar içerisindeki birleşik ifadeler parantez içersine alındığında block içerisindeki son atama yapılan değişkenin değerini döndürür. İşte örnek uygulama.

#include <stdio.h>

#include <conio.h>

int main(int argc,char argv[])

{

int rslt;

rslt = ({

int x = 30;

int y;

y = x + 4;

});

printf("rslt=%d\n",rslt);

return 0;

}

 

Bu program diğer birçok derleyicide derlenmezken gcc ile derlenir ve şu çıktıyı verir.

 

rslt=34

 

Şartsal Operant Atımı

 

Üçlü operatörü aşağıdaki gibi standart c de kullanabiliriz.

 

x=y?y:z;

 

Eğer y sıfırdan farklı ise x e y değeri atanır. Eğer y sıfıra eşit ise bu durumda x e z değeri atanır.

 

gcc de bunu aşağıdaki gibi yazabiliriz.

 

x=y? :z;

 

Aynı şekilde işlev görevbildiği gibi y eğer yan etkilere sahipse (yani işlem yaparken değeri bir anda sıfır olabiliyorsa) ikinci yazma şekli bu yan etkiyi ortadan kaldırabilir.