• gcc seçeneklerini keşfetme. Tanımlama yönergelerinde x86 GCC Standart izleme seçenekleri için en uygun seçenekler

    GCC'nin performans açısından diğer derleyicilerin gerisinde kaldığına inanılıyor. Bu yazıda, kabul edilebilir bir performans elde etmek için hangi temel GCC derleyici optimizasyonlarının uygulanması gerektiğini anlamaya çalışacağız.

    GCC'deki varsayılan seçenekler nelerdir?

    (1) Varsayılan olarak, GCC "-O0" optimizasyon seviyesini kullanır. Performans açısından açıkça optimal değildir ve nihai ürünün derlenmesi için önerilmez.
    GCC, "-march=native" seçeneği geçilene kadar derlemenin çalıştırıldığı mimariyi tanımaz. Varsayılan olarak GCC, yapılandırması sırasında ayarlanan seçeneği kullanır. GCC yapılandırmasını bulmak için şunu çalıştırın:

    Bu, GCC'nin seçeneklerinize "-march=corei7" ekleyeceği anlamına gelir (başka bir mimari belirtilmedikçe).
    x86 için çoğu GCC derleyicisi (64 bit Linux için temel), yapılandırmada mimariye özgü hiçbir seçenek verilmediğinden, verilen seçeneklere "-mtune=generic -march=x86-64" ekler. GCC'yi başlatırken geçirilen tüm seçeneklerin yanı sıra dahili seçeneklerini şu komutla her zaman öğrenebilirsiniz:

    Sonuç olarak, yaygın olarak kullanılan:

    Kullanılacak mimariyi belirtmek performans için önemlidir. Tek istisna, kitaplık işlevlerinin çağrılmasının neredeyse tüm başlatma süresini aldığı programlar olarak kabul edilebilir. GLIBC, çalışma zamanında belirli bir mimari için en uygun işlevi seçebilir. Statik olarak bağlandığında, bazı GLIBC işlevlerinin farklı mimariler için versiyonlanmadığına dikkat etmek önemlidir. Yani, GLIBC işlevlerinin hızı önemliyse dinamik montaj daha iyidir..
    (2) Varsayılan olarak, 32 bit modunda x86 için çoğu GCC derleyicisi, "-mfpmath=sse" olmadan yapılandırıldıkları için x87 kayan nokta modelini kullanır. Yalnızca GCC yapılandırması "--with-mfpmath=sse" içeriyorsa:

    derleyici varsayılan olarak SSE modelini kullanacaktır.Diğer tüm durumlarda, 32 bit modunda derlemeye “-mfpmath=sse” seçeneğini eklemek daha iyidir.
    Yani, yaygın olarak kullanılan:

    32 bit modunda ”-mfpmath=sse” seçeneğinin eklenmesi önemlidir! Konfigürasyonunda "--with-mfpmath=sse" olan bir derleyici istisnadır.

    32 bit modu mu yoksa 64 bit mi?

    32 bit modu genellikle kullanılan bellek miktarını azaltmak ve sonuç olarak onunla çalışmayı hızlandırmak için kullanılır (önbelleğe daha fazla veri yerleştirilir).
    64 bit modunda (32 bit ile karşılaştırıldığında) kullanılabilir genel kayıt sayısı 6'dan 14'e, XMM kayıtları 8'den 16'ya çıkar. Ayrıca, 64 bit mimarilerin tümü SSE2 uzantısını destekler, dolayısıyla 64 bit modunda yapmanız gerekmez “-mfpmath” seçeneğini ekleyin =sse".
    Bilgi işlem görevleri için 64 bit modunun ve mobil uygulamalar için 32 bit modunun kullanılması önerilir.

    Maksimum performans nasıl elde edilir?

    Performansı en üst düzeye çıkarmak için bir dizi seçenek yoktur, ancak GCC'de denemeye değer birçok seçenek vardır. Aşağıda, Intel Atom ve 2. Nesil Intel Core i7 işlemciler için "-O2" seçeneğine göre önerilen seçenekleri ve büyüme tahminlerini içeren bir tablo bulunmaktadır. Tahminler, GCC sürüm 4.7 tarafından derlenen belirli bir dizi görevin sonuçlarının geometrik ortalamasına dayanmaktadır. Ayrıca, derleyici yapılandırmasının genel x86-64 için yapıldığını varsayar.
    “-O2” ye göre mobil uygulamalarda performans artışı tahmini (mobil segment için ana mod olduğundan yalnızca 32 bit modunda):

    Hesaplamalı görevlerde "-O2"ye göre performans artışı tahmini (64 bit modunda):
    -m64 -Ofast -flto ~17%
    -m64 -Ofast -flto -march=yerli ~21%
    -m64 -Ofast -flto -march=yerel -funroll-döngüleri ~22%

    “-O2 -mfpmath=sse” seçenekleriyle bilgi işlem görevleri için 64 bit modunun 32 bit'e göre avantajı yaklaşık %5'tir
    Makaledeki tüm veriler, belirli bir kıyaslama setinin sonuçlarına dayanan bir tahmindir.
    Makalede kullanılan seçeneklerin açıklaması aşağıdadır. Tam açıklama (İngilizce): http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html"
    • "-Ofast", "-O3 -ffast-math" gibi, aritmetik hesaplamalar için daha yüksek düzeyde optimizasyon ve daha agresif optimizasyon sağlar (gerçek yeniden ilişkilendirme gibi)
    • "-flto" modüller arası optimizasyonlar
    • "-m32" 32 bit modu
    • "-mfpmath=sse", XMM kayıtlarının gerçek aritmetikte kullanılmasını sağlar (x87 modunda gerçek yığın yerine)
    • "-funroll-loops" döngü açmayı etkinleştirir

    Linux için standart C derleyicisi olan gcc'yi doğru şekilde kullanmak için komut satırı seçeneklerini öğrenmeniz gerekir. Ayrıca gcc, C dilini genişletir.Kaynak kodunuzu o dilin ANSI standardında yazmayı düşünseniz bile, Linux başlık dosyalarını anlamak için bilmeniz gereken bazı gcc uzantıları vardır.

    Komut satırı seçeneklerinin çoğu, C derleyicileri tarafından kullanılanlarla aynıdır.Bazı seçenekler için herhangi bir standart yoktur. Bu bölümde, günlük programlamada kullanılan en önemli seçenekleri ele alacağız.

    ISO C standardına uymaya çalışmak faydalıdır, ancak C düşük seviyeli bir dil olduğu için standart özelliklerin yeterince açıklayıcı olmadığı durumlar vardır. gcc uzantılarının yaygın olarak kullanıldığı iki alan vardır: derleme koduyla etkileşim (bu konular http://www.delorie.com/djgpp/doc/brennan/ adresinde ele alınmaktadır) ve paylaşılan kitaplıklar oluşturmak (bkz. Bölüm 8). Başlık dosyaları paylaşılan kitaplıkların parçası olduğundan, bazı uzantılar sistem başlık dosyalarında da görünür.

    Tabii ki, kodlamaya gerçekten yardımcı olabilecek başka herhangi bir programlama türünde yararlı olan daha birçok uzantı vardır. Bu uzantılar hakkında daha fazla bilgi gcc Texinfo belgelerinde bulunabilir.

    5.1. gcc seçenekleri

    gcc birçok komut seçeneğini kabul eder. Neyse ki, gerçekten farkında olmanız gereken seçenekler kümesi o kadar büyük değil ve bu bölümde ona bakacağız.

    Seçeneklerin çoğu, diğer derleyicilerinkilerle aynı veya benzerdir, gcc, info gcc aracılığıyla seçeneklerinin büyük bir dokümantasyonunu içerir (gcc man sayfası da bu bilgiyi verir, ancak man sayfaları, Texinfo dokümantasyonu kadar sık ​​​​güncellenmez. ).

    -o dosya adı Çıktı dosyasının adını belirtir. Bu genellikle bir nesne dosyasına derlerken gerekli değildir, yani varsayılan değer dosyaadı.c'yi dosyaadı.o ile değiştirmektir. Ancak, bir yürütülebilir dosya oluşturursanız, varsayılan olarak (tarihsel nedenlerle) a.out adı altında oluşturulur. Bu, çıktı dosyasını farklı bir dizine yerleştirmek istediğinizde de kullanışlıdır.
    -İle Komut satırında belirtilen kaynak dosyayı bağlamadan derler. Sonuç olarak, her kaynak dosya için bir nesne dosyası oluşturulur. make kullanırken, gcc derleyicisi genellikle her nesne dosyası için çağrılır; bu şekilde, bir hata durumunda hangi dosyanın derlenemeyeceğini bulmak daha kolaydır. Ancak, komutları elle yazıyorsanız, tek bir gcc çağrısında birden çok dosyanın belirtilmesi alışılmadık bir durum değildir. Komut satırında birden çok dosya belirtilirken belirsizlik ortaya çıkabilirse, yalnızca bir dosya belirtmek daha iyidir. Örneğin, gcc -c -o a.o a.c b.c yerine gcc -c -o a.o b.c kullanmak mantıklıdır.
    -Dfoo Komut satırında önişlemci makrolarını tanımlar. Kabuğun özel karakterler olarak gördüğü karakterleri atmanız gerekebilir. Örneğin, bir dizi tanımlarken, " diziyi sonlandıran karakterleri kullanmaktan kaçınmalısınız. En yaygın iki yol "-Dfoo="bar"" ve -Dfoo=\"bar\" şeklindedir. İlk yol, şu durumlarda çok daha iyi çalışır: dizide boşluklar vardır, çünkü kabuk boşlukları özel bir şekilde ele alır.
    -I dizini Dahil edilen dosyaları aramak için dizin listesine bir dizin ekler.
    -L dizini Kitaplıkları aramak için dizin listesine bir dizin ekler, gcc, aksi belirtilmedikçe paylaşılan kitaplıkları statik olanlara tercih eder.
    -foo lib foo kitaplığına karşı bağlantılar. Aksi belirtilmedikçe, gcc paylaşılan kitaplıklara (lib foo .so) bağlanmayı statik olanlara (lib foo .a) tercih eder. Bağlayıcı, listelenen tüm kitaplıklardaki işlevleri listelendikleri sırayla arar. Arama, gerekli tüm işlevler bulunduğunda sona erer.
    -statik Yalnızca statik kitaplıklara sahip bağlantılar. 8. bölüme bakın.
    -g , -ggdb Hata ayıklama bilgilerini içerir. -g seçeneği, gcc'nin standart hata ayıklama bilgilerini içermesine neden olur. -ggdb seçeneği, yalnızca gdb hata ayıklayıcısının anlayabileceği büyük miktarda bilgi eklemenizi söyler.
    Disk alanı sınırlıysa veya bağlantı hızı için bazı işlevlerden fedakarlık etmek istiyorsanız, -g kullanmalısınız. Bu durumda, gdb dışında bir hata ayıklayıcı kullanmanız gerekebilir. En eksiksiz hata ayıklama için -ggdb belirtmelisiniz. Bu durumda gcc, gdb için mümkün olduğu kadar fazla bilgi hazırlayacaktır. Çoğu derleyiciden farklı olarak, gcc'nin bazı hata ayıklama bilgilerini optimize edilmiş koda koyduğu belirtilmelidir. Ancak, optimize edilmiş kodun hata ayıklayıcısında izleme yapmak yanıltıcı olabilir çünkü çalışma zamanı kodun çalıştırmayı beklediğiniz kısımlarını atlayabilir ve atlayabilir. Ancak, derleyicileri optimize etmenin kodun yürütülme şeklini nasıl değiştirdiği konusunda iyi bir fikir edinebilirsiniz.
    -O, -Açık gcc'nin kodu optimize etmesine neden olur. Varsayılan olarak, gcc az miktarda optimizasyon yapar; bir sayı (n) belirtilirken, optimizasyon belirli bir düzeyde gerçekleştirilir. En yaygın optimizasyon düzeyi 2'dir; şu anda gcc'nin standart sürümündeki en yüksek optimizasyon düzeyi 3'tür. -O2 veya -O3 kullanmanızı öneririz; -O3, uygulamanın boyutunu artırabilir, bu nedenle önemliyse ikisini de deneyin. Uygulamanız için bellek ve disk alanı önemliyse, artan yürütme süresi pahasına kod boyutunu en aza indiren -Os seçeneğini de kullanabilirsiniz. gcc, yalnızca en az minimum optimizasyon (-O) uygulandığında yerleşikleri etkinleştirir.
    -ansi Tüm ANSI standartlarının (X3.159-1989) veya ISO eşdeğerlerinin (ISO/IEC 9899:1990) (genellikle C89 veya daha az yaygın olarak C90 olarak anılır) C programlarında destek. Bunun ANSI/ISO standardı ile tam uyum sağlamadığını unutmayın.
    -ansi seçeneği, normalde ANSI/ISO standartlarıyla çelişen gcc uzantılarını devre dışı bırakır. (Bu uzantıların diğer birçok C derleyicisi tarafından desteklenmesi nedeniyle, bu pratikte bir sorun değildir.) Ayrıca, başlık dosyalarının ANSI/ISO uyumluluğunu desteklemek için kullandığı __STRICT_ANSI__ makrosunu da (bu kitapta daha sonra açıklanacağı gibi) tanımlar. çevre.
    bilgiçlik taslayan ANSI/ISO C dil standardının gerektirdiği tüm uyarıları ve hataları görüntüler, bu ANSI/ISO standardına tam uyum sağlamaz.
    -Duvar Genellikle yararlı olan tüm gcc uyarılarının oluşturulmasını sağlar. Ancak bu, belirli durumlarda yararlı olabilecek seçenekleri içermez. Kaynak kodunuz için tiftik ayrıştırıcı için benzer bir ayrıntı düzeyi ayarlanacaktır, gcc, her bir derleyici uyarısını manuel olarak açıp kapatmanıza izin verir. gcc kılavuzu tüm uyarıları ayrıntılı olarak açıklar.
    5.2. başlık dosyaları
    5.2.1. uzunca

    long long türü, bellek bloğunun en az long kadar büyük olduğunu gösterir. Intel i86 ve diğer 32 bit platformlarda, uzun 32 bit, uzun uzun ise 64 bittir. 64 bit platformlarda, işaretçiler ve uzun uzunlar 64 bit, uzunlar ise platforma bağlı olarak 32 veya 64 bit alabilir. Uzun uzun tip, C99 standardında (ISO/IEC 9899:1999) desteklenir ve gcc tarafından sağlanan uzun süredir devam eden bir C uzantısıdır.

    5.2.2. Yerleşik İşlevler

    Linux başlık dosyalarının bazı bölümleri (özellikle belirli bir sisteme özgü olanlar), yerleşik işlevleri çok kapsamlı bir şekilde kullanır. Makrolar kadar hızlıdırlar (işlev çağrıları için ücret alınmaz) ve normal bir işlev çağrısında bulunan her türlü doğrulamayı sağlarlar. Yerleşik işlevleri çağıran kod, en azından minimum optimizasyon (-O) etkinleştirilmiş olarak derlenmelidir.

    5.2.3. Alternatif genişletilmiş anahtar kelimeler

    gcc'de, her genişletilmiş anahtar kelimenin (ANSI/ISO standardı tarafından tanımlanmayan anahtar kelimeler) iki versiyonu vardır: anahtar kelimenin kendisi ve her iki tarafı iki alt çizgi ile çevrelenmiş anahtar kelime. Derleyici standart modda kullanıldığında (genellikle -ansi seçeneği etkinleştirildiğinde), normal genişletilmiş anahtar sözcükler tanınmaz. Bu nedenle, örneğin, bir başlık dosyasındaki nitelik anahtar sözcüğü __attribute__ olarak yazılmalıdır.

    5.2.4. Öznitellikler

    Öznitelik genişletilmiş anahtar sözcüğü, bir işlev, değişken veya bildirilen tür hakkında ANSI/ISO C kodunun izin verdiğinden daha fazla bilgiyi gcc'ye iletmek için kullanılır. Örneğin, align niteliği, gcc'ye bir değişkeni veya türü tam olarak nasıl hizalayacağını söyler; paketlenmiş özniteliği, hiçbir dolgunun kullanılmayacağını belirtir; noreturn, gcc'nin daha iyi optimizasyon yapmasına ve sahte uyarılardan kaçınmasına izin veren işlevin asla geri dönmediğini belirtir.

    İşlev öznitelikleri, işlev bildirimine eklenerek bildirilir, örneğin:

    void die_die_die(int, char*) __attribute__ ((__noreturn__));

    Bir öznitelik bildirimi, parantezler ve bir noktalı virgül arasına yerleştirilir ve öznitelik anahtar kelimesini ve ardından çift parantez içindeki öznitelikleri içerir. Çok sayıda öznitelik varsa, virgülle ayrılmış bir liste kullanılmalıdır.

    int print(char*, ...)

    Nitelik__((sabit,

    format(printf, 1, 2));

    Bu örnekte, printm'nin belirtilenler dışında herhangi bir değeri dikkate almadığını ve kod oluşturma (const) ile ilgili herhangi bir yan etkisinin olmadığını görebilirsiniz, printm, gcc'nin fonksiyon argümanlarını printf() ile aynı şekilde kontrol etmesi gerektiğini belirtir. argümanlar. İlk bağımsız değişken, biçim dizesidir ve ikinci bağımsız değişken, ilk değiştirme parametresidir (biçim).

    Materyal ilerledikçe bazı nitelikler tartışılacaktır (örneğin, Bölüm 8'de paylaşılan kütüphaneler oluşturmanın açıklaması sırasında). Nitelikler hakkında kapsamlı bilgi, Texinfo biçimindeki gcc belgelerinde bulunabilir.

    Zaman zaman kendinizi Linux başlık dosyalarına bakarken bulabilirsiniz. Büyük olasılıkla ANSI/ISO uyumlu olmayan birkaç tasarım bulacaksınız. Bazıları incelemeye değer. Bu kitapta ele alınan tüm yapılar, gcc belgelerinde daha ayrıntılı olarak ele alınmıştır.

    Zaman zaman kendinizi Linux başlık dosyalarına bakarken bulabilirsiniz. Büyük olasılıkla ANSI/ISO uyumlu olmayan birkaç tasarım bulacaksınız. Bazıları incelemeye değer. Bu kitapta ele alınan tüm yapılar, gcc belgelerinde daha ayrıntılı olarak ele alınmıştır.

    Artık C standardı hakkında biraz bilgi edindiğinize göre, gcc derleyicisinin yazdığınız dilin C standardına uygun olmasını sağlamak için sunduğu seçeneklere bir göz atalım. C kodunuzun standartlara uygun ve hatasız olmasını sağlamanın üç yolu vardır: standardın hangi sürümüne uymak istediğinizi kontrol eden seçenekler, başlık dosyalarını kontrol eden tanımlar ve daha katı kod kontrolünü tetikleyen uyarı seçenekleri.

    gcc'nin çok sayıda seçeneği vardır ve burada yalnızca en önemli olduğunu düşündüklerimizi ele alacağız. Seçeneklerin tam listesi gcc online kılavuz sayfalarında bulunabilir. Ayrıca kullanılabilecek bazı #define yönerge seçeneklerinden kısaca bahsedeceğiz; normalde herhangi bir #include satırından önce kaynak kodunuzda belirtilmeli veya gcc komut satırında tanımlanmalıdır. Mevcut standardı kullanılmaya zorlamak için basit bir bayrak yerine hangi standardın kullanılacağını seçme seçeneklerinin bolluğu sizi şaşırtabilir. Bunun nedeni, birçok eski programın geçmiş derleyici davranışına dayanması ve bunları en son standartlara güncellemek için önemli çalışmalar gerektirmesidir. Nadiren, derleyicinizi çalışan kodu bozacak şekilde güncellemek istersiniz. Standartlar değiştikçe, standardın en son versiyonu olmasa bile belirli bir standarda karşı çalışabilmek önemlidir.

    Kişisel kullanım için küçük bir program yazıyor olsanız bile, standartlara uygunluğun o kadar da önemli olmayabileceği durumlarda, program yürütülmeden önce derleyiciyi kodunuzdaki hataları aramaya zorlamak için ek gcc uyarıları eklemek genellikle mantıklıdır. Bu, hata ayıklayıcıdaki kodda adım adım ilerlemekten ve sorunun nerede olabileceğini merak etmekten her zaman daha etkilidir. Derleyici, bir standarda uyan ancak muhtemelen şüpheli semantiklere sahip kodu algılama yeteneği gibi basit standart denetiminin ötesine geçen birçok seçeneğe sahiptir. Örneğin, bir program, bir değişkene başlatılmadan önce erişilmesine izin veren bir yürütme sırasına sahip olabilir.

    Ortak kullanım için bir program yazmanız gerekiyorsa, uyumluluk derecesi ve yeterli olduğunu düşündüğünüz derleyici uyarı türleri göz önüne alındığında, biraz daha çaba sarf etmek ve kodunuzu hiç uyarı olmadan derlemek çok önemlidir. Bazı uyarıları kabul edip görmezden gelmeyi alışkanlık haline getirirseniz, bir gün kaçırma riskiniz olan daha ciddi bir uyarı görünebilir. Kodunuz her zaman uyarı mesajları olmadan derleniyorsa, mutlaka yeni bir uyarı dikkatinizi çekecektir. Uyarı vermeden kod derlemek, benimsenmesi gereken iyi bir alışkanlıktır.

    İzleme Standartları için Derleyici Seçenekleri

    Ansi, standartlarla ilgili en önemli seçenektir ve derleyicinin ISO C90 dil standardına göre hareket etmesini sağlar. Standartla uyumlu olmayan bazı gcc uzantılarını devre dışı bırakır, C programlarında C++ stili yorumları (//) devre dışı bırakır ve ANSI trigraflarının (üç karakterli diziler) işlenmesini sağlar. Ek olarak, standartla uyumlu olmayan başlık dosyalarındaki bazı uzantıları devre dışı bırakan __STRICT_ANSI__ makrosunu içerir. Derleyicinin gelecek sürümlerinde kabul edilen standart değişebilir.

    Std= - Bu seçenek, tam olarak hangi standardın gerekli olduğunu belirten bir parametre sağlayarak hangi standardın kullanılacağı konusunda daha hassas kontrol sağlar. Aşağıdakiler mevcut ana seçeneklerdir:

    C89 - C89 standardını destekler;

    Iso9899:1999 - ISO standardı C90'ın en son sürümünü destekler;

    Gnu89 - C89 standardını destekler ancak bazı GNU uzantılarına ve bazı C99 işlevlerine izin verir. gcc'nin 4.2 sürümünde bu seçenek varsayılandır.

    Tanımlama direktiflerinde standardı izleme seçenekleri

    Komut satırında seçenek olarak veya programın kaynak kodunda tanım olarak belirtilebilen sabitler (#tanımlar) vardır. Biz bunları genellikle derleyici komut satırını kullanıyormuş gibi düşünürüz.

    STRICT_ANSI__ ISO C standardını kullanılmaya zorlar. Derleyici komut satırında -ansi seçeneği verildiğinde tanımlanır.

    POSIX_C_SOURCE=2 - IEEE Std 1003.1 ve 1003.2 tarafından tanımlanan işlevselliği etkinleştirir. Bu bölümde daha sonra bu standartlara geri döneceğiz.

    BSD_SOURCE - BSD sistemlerinin işlevselliğini etkinleştirir. POSIX tanımlarıyla çelişirlerse, BSD tanımları önceliklidir.

    GNU_SOURCE - GNU uzantıları da dahil olmak üzere çok çeşitli özellik ve işlevlere izin verir. Bu tanımlar POSIX tanımlarıyla çelişiyorsa, ikincisi öncelik kazanır.

    Uyarıların çıktısı için derleyici seçenekleri

    Bu seçenekler komut satırından derleyiciye iletilir. Yine, yalnızca ana olanları listeleyeceğiz, tam bir liste gcc çevrimiçi yardım kılavuzunda bulunabilir.

    Pedantic, C kodu için en güçlü temizleme seçeneğidir.C standardına göre kontrol etme seçeneğini etkinleştirmenin yanı sıra, standart tarafından yasaklanan bazı geleneksel C yapılarını devre dışı bırakır ve tüm GNU uzantılarını standarttan yasa dışı kılar. Bu seçenek, C kodunuzu olabildiğince taşınabilir hale getirmek için kullanılmalıdır.Dezavantajı, derleyicinin kodunuzun temizliğiyle çok ilgilenmesi ve bazen kalan birkaç uyarıdan kurtulmak için kafa yormanız gerekmesidir.

    Wformat - printf ailesinin işlevlerinin argüman türlerinin doğruluğunu kontrol eder.

    Wparentheses - gerekmedikleri yerlerde bile parantezleri kontrol eder. Bu seçenek, karmaşık yapıların amaçlandığı gibi başlatılıp başlatılmadığını kontrol etmek için çok kullanışlıdır.

    wswitch-default - Genellikle iyi programlama stili olarak kabul edilen switch deyimlerinde varsayılan varyantın varlığını kontrol eder.

    Wunused - Bildirilen ancak bildirilmeyen statik işlevler, kullanılmayan parametreler, atılan sonuçlar gibi çeşitli durumları kontrol eder.

    Duvar - Önceki tüm -W seçenekleri dahil olmak üzere çoğu gcc uyarı türünü etkinleştirir (yalnızca -pedantic kapsanmaz). Yardımı ile program kodunun temizliğini elde etmek kolaydır.

    Not

    Daha birçok gelişmiş uyarı seçeneği vardır, tüm ayrıntılar için gcc web sayfalarına bakın. Genel olarak -Wall kullanmanızı öneririz; yüksek kaliteli kod sağlamak için kontrol etmek ile derleyicinin iptal edilmesi zor hale gelen çok sayıda önemsiz uyarı vermesi arasında iyi bir uzlaşmadır.

    GCC C, C++ dilleri için serbestçe kullanılabilen bir optimizasyon derleyicisidir.

    programı gcc, komut satırından başlatılan, bir grup derleyici için bir eklentidir. Parametre olarak iletilen dosya adı uzantılarına ve ek seçeneklere bağlı olarak, gcc gerekli önişlemcileri, derleyicileri, bağlayıcıları çalıştırır.

    Uzantısı olan dosyalar .cc veya .C C++ dosyaları, uzantılı dosyalar gibi ele alınır .C C dilinde programlar ve uzantılı dosyalar olarak nesneler olarak kabul edilir.

    Bir dosyada bulunan C++ kaynak kodunu derlemek için Fcc ve bir nesne dosyası oluşturun F.o., komutu çalıştırmanız gerekir:

    Gcc -c F.cc

    -c seçeneği "yalnızca derleme" anlamına gelir.

    Kaynak kodundan türetilen bir veya daha fazla nesne dosyasını bağlamak için - F1.o, F2.o, ... - tek bir yürütülebilir dosyaya F, komutu girmeniz gerekir:

    Gcc -o F F1.o F2.o

    -o seçeneği yürütülebilir dosyanın adını belirtir.

    Derleme ve bağlama olmak üzere iki işlem adımını aşağıdaki komutu kullanarak tek bir ortak adımda birleştirmek mümkündür:

    Gcc -o F F1.cc ... -lg++

    - olası ek derleme ve bağlantı seçenekleri. –lg++ seçeneği, C++ standart kitaplığının dahil edilmesi gerektiğini belirtir, - olası ek kitaplıklar.
    Bağlandıktan sonra, komutla çalıştırılabilen bir F yürütülebilir dosyası oluşturulur.

    ./F

    - programınız için komut satırı argümanlarının bir listesi.
    Kitaplıklar genellikle bağlantı oluşturma sürecinde kullanılır. Kitaplık, tek bir dosyada gruplandırılmış ve dizine alınmış bir dizi nesne dosyasıdır. link komutu, bağlanacak nesne dosyaları listesinde bir kitaplık bulduğunda, zaten bağlı olan nesne dosyalarının kitaplık dosyalarından birinde tanımlanan işlevlere çağrı içerip içermediğini kontrol eder. Bu tür işlevler bulunursa, karşılık gelen çağrılar kitaplıktan nesne dosya koduna bağlanır. -lname seçeneği ile kütüphaneler eklenebilir. Bu durumda, standart dizinlerde, örneğin /lib , /usr/lib, /usr/yerel/lib isimli dosyada kütüphaneyi arayacaktır. libname.a. Kitaplıklar, ilgili işlevlerine yapılan çağrıları içeren kaynak veya nesne dosyalarından sonra listelenmelidir.

    Derleme Seçenekleri

    Pek çok derleme ve bağlama seçeneği arasında en sık kullanılanlar şunlardır:

    Seçenek Amaç
    -C Bu seçenek, yalnızca derlemenin gerekli olduğu anlamına gelir. Programın kaynak dosyalarından, nesne dosyaları şeklinde oluşturulur. isim.o. Bağlama yapılmaz.
    -Dname=değer Derlenmiş programdaki ad adını v değeri olarak tanımlayın alu. Etki, dizeye sahip olmakla aynıdır #ad değerini tanımla programın başında. Parça = değer atlanabilir, bu durumda varsayılan değer 1'dir.
    -o dosya adı Kullanmak dosya adı oluşturulan dosyanın adı olarak.
    -isim Bağlanırken libname.so kullanın
    -Llib yolu
    -Iinclude-yolu
    Standart kitaplıklara ve başlık arama dizinlerine sırasıyla lib-path ve include-path ekleyin.
    -G Hata ayıklayıcı için nesneye veya yürütülebilir dosyaya hata ayıklama bilgilerini koyun gdb. Seçenek hem derleme hem de bağlama için belirtilmelidir. kombinasyon halinde -G optimizasyonu devre dışı bırakma seçeneğinin kullanılması önerilir –O0(aşağıya bakınız)
    -MM Bir C veya C++ programında kullanılan başlık dosyalarındaki bağımlılıkları, yardımcı programa uygun bir biçimde yazdırın yapmak. Hiçbir nesne veya yürütülebilir dosya oluşturulmaz.
    -pg Yardımcı program tarafından kullanılan bilgileri oluşturmak için profil oluşturma yönergelerini bir nesneye veya yürütülebilir dosyaya yerleştirin gprof. Seçenek hem derleme hem de bağlama için belirtilmelidir. Opsiyonlu montajlı -pg Program başlangıçta bir istatistik dosyası oluşturur. programı gprof bu dosyaya dayalı olarak, her işlevi yürütmek için harcanan zamanı gösteren bir transkript oluşturur.
    -Duvar Programın derlenmesi sırasında meydana gelen tüm uyarılar veya hatalar hakkında mesajlar yazdırın.
    -O1
    -O2
    -O3
    Çeşitli optimizasyon seviyeleri.
    -O0 Optimize etmeyin. Birden fazla kullanıyorsanız kat numarası olan veya olmayan seçenekler, bu tür son seçenek geçerlidir.
    -BEN Derleme sürecinde başlık dosyalarını aramak için kendi dizinlerinizi eklemek için kullanılır
    -L Bağlayıcıya geçti. Oluşturma işlemi sırasında kitaplıkları aramak için kendi dizinlerinizi eklemek için kullanılır.
    -l Bağlayıcıya geçti. Oluşturma işlemi sırasında aranacak kendi kitaplıklarınızı eklemek için kullanılır.