Bir C ++ programının derlenmesi üç adımdan oluşur:
Önişleme: önişlemci bir C ++ kaynak kodu dosyası alır ve #include
s, #define
s ve diğer önişlemci direktifleriyle ilgilenir. Bu adımın çıktısı, işlemci öncesi yönergeleri olmayan "saf" bir C ++ dosyasıdır.
Derleme: derleyici ön işlemcinin çıktısını alır ve ondan bir nesne dosyası üretir.
Bağlama: bağlayıcı derleyici tarafından üretilen nesne dosyalarını alır ve bir kütüphane ya da yürütülebilir bir dosya üretir.
Ön İşleme
Önişlemci ve gibi önişlemci yönergelerini işler . C ++ sözdiziminin agnostikidir, bu yüzden dikkatli kullanılmalıdır.#include
#define
Bu değiştirerek her seferinde bir C ++ kaynak dosyası üzerinde çalışır #include
, (genellikle sadece beyanlar olduğu) ilgili dosyaların içeriği ile direktiflerini makrolar (değiştirilmesini yapıyor #define
) ve farklı metnin bölümlerini bağlı olarak seçilmesi #if
, #ifdef
ve #ifndef
direktifleri.
Önişlemci, önişlem belirteçleri akışı üzerinde çalışır. Makro değiştirme, belirteçleri diğer belirteçlerle değiştirmek olarak tanımlanır (operatör ##
mantıklı olduğunda iki belirtecin birleştirilmesini sağlar).
Tüm bunlardan sonra, önişlemci yukarıda açıklanan dönüşümlerden kaynaklanan bir token akışı olan tek bir çıktı üretir. Ayrıca derleyiciye her satırın nereden geldiğini bildiren bazı özel işaretler ekler, böylece bunları makul hata mesajları üretmek için kullanabilir.
Bu aşamada #if
ve #error
direktiflerinin akıllıca kullanılmasıyla bazı hatalar üretilebilir .
Derleme
Derleme adımı önişlemcinin her çıktısında gerçekleştirilir. Derleyici saf C ++ kaynak kodunu ayrıştırır (şimdi herhangi bir önişlemci yönergesi olmadan) ve derleme koduna dönüştürür. Ardından, bu kodu makine koduna bir araya getiren ve bir biçimde gerçek ikili dosya (ELF, COFF, a.out, ...) üreten alt arka ucu (araç zincirinde birleştirici) çağırır. Bu nesne dosyası, girişte tanımlanan sembollerin derlenmiş kodunu (ikili biçimde) içerir. Nesne dosyalarındaki sembollere ad verilir.
Nesne dosyaları tanımlanmamış sembollere başvurabilir. Bir bildirim kullandığınızda ve bunun için bir tanım sağlamadığınızda durum budur. Derleyici buna aldırmaz ve kaynak kodu iyi biçimlendirilmiş olduğu sürece nesne dosyasını mutlu bir şekilde üretir.
Derleyiciler genellikle bu noktada derlemeyi durdurmanıza izin verir. Bu, her kaynak kod dosyasını ayrı olarak derleyebileceğiniz için çok kullanışlıdır. Bunun sağladığı avantaj, yalnızca tek bir dosyayı değiştirirseniz her şeyi yeniden derlemenize gerek olmamasıdır .
Oluşturulan nesne dosyaları, daha sonra yeniden kullanmak için statik kütüphaneler adı verilen özel arşivlere yerleştirilebilir.
Bu aşamada, sözdizimi hataları veya başarısız aşırı yük çözüm hataları gibi "normal" derleyici hataları bildirilir.
bağlayıcı
Bağlayıcı, derleyicinin ürettiği nesne dosyalarından son derleme çıktısını üreten şeydir. Bu çıktı, paylaşılan (veya dinamik) bir kitaplık olabilir (ve ad benzer olsa da, daha önce belirtilen statik kitaplıklarla pek ortak noktası yoktur) veya yürütülebilir bir dosya olabilir.
Tanımlanmamış sembollere yapılan referansları doğru adreslerle değiştirerek tüm nesne dosyalarını birbirine bağlar. Bu sembollerin her biri diğer nesne dosyalarında veya kütüphanelerde tanımlanabilir. Standart kitaplık dışındaki kitaplıklarda tanımlanmışlarsa, bağlayıcıya bu kitaplardan bahsetmeniz gerekir.
Bu aşamada en yaygın hatalar eksik tanımlar veya yinelenen tanımlardır. Birincisi, tanımların mevcut olmadığı (yani yazılmadıkları) veya ikamet ettikleri nesne dosyalarının veya kütüphanelerinin bağlayıcıya verilmediği anlamına gelir. İkincisi açıktır: Aynı sembol iki farklı nesne dosyasında veya kütüphanesinde tanımlanmıştır.