GNU/Linux >> Znalost Linux >  >> Linux

Neobvyklé, ale užitečné možnosti příkazového řádku GCC

Softwarové nástroje obvykle nabízejí více funkcí, ale – jak většina z vás bude souhlasit – ne všechny jejich funkce využívá každý. Obecně řečeno, není na tom nic špatného, ​​protože každý uživatel má své vlastní požadavky a používá nástroje pouze v této oblasti. Vždy je však dobré neustále zkoumat nástroje, které používáte, protože nikdy nevíte, kdy se některá z jejich funkcí může hodit, což vám ušetří část vašeho drahocenného času v procesu.

Příklad:kompilátory. Dobrý kompilátor programovacího jazyka vždy nabízí nepřeberné množství možností, ale uživatelé obecně znají a používají pouze omezenou sadu. Konkrétně, pokud jste vývojář jazyka C a používáte Linux jako svou vývojovou platformu, je vysoce pravděpodobné, že byste použili kompilátor gcc, který nabízí nekonečný seznam možností příkazového řádku.

Víte, že pokud chcete, můžete požádat gcc o uložení výstupu v každé fázi procesu kompilace? Znáte zeď? možnost, kterou používáte pro generování varování, nepokrývá některá konkrétní varování? Existuje mnoho možností příkazového řádku gcc, které se běžně nepoužívají, ale mohou být extrémně užitečné v určitých scénářích, například při ladění kódu.

V tomto článku tedy pokryjeme několik takových možností, nabídneme všechny požadované podrobnosti a vysvětlíme je pomocí snadno srozumitelných příkladů, kdykoli je to nutné.

Ale než budeme pokračovat, mějte prosím na paměti, že všechny příklady, příkazy a pokyny uvedené v tomto tutoriálu byly testovány na Ubuntu 16.04 LTS a verze gcc, kterou jsme použili, je 5.4.0. em>

 

Zobrazit mezivýstup během každé fáze kompilace

Víte, že existují celkem čtyři fáze, kterými prochází váš kód C, když jej kompilujete pomocí kompilátoru gcc? Jedná se o předběžné zpracování, kompilaci, sestavení a propojení. Po každé fázi gcc vytvoří dočasný výstupní soubor, který je předán do další fáze. Nyní jsou to všechny dočasné soubory, které jsou vytvářeny, a proto je nevidíme – vidíme pouze to, že jsme zadali kompilační příkaz a ten vytvoří binární/spustitelný soubor, který můžeme spustit.

Předpokládejme však, že pokud během ladění existuje požadavek, abyste viděli, jak se kód staral, řekněme, o fázi předběžného zpracování. Tak co bys dělal? Dobrá věc je, že kompilátor gcc nabízí možnost příkazového řádku, kterou můžete použít ve svém standardním příkazu kompilace, a získáte ty přechodné soubory, které kompilátor jinak odstraní. Možnost, o které mluvíme, je -save-temps .

Zde je to, co o této možnosti říká manuálová stránka gcc:

           Store the usual "temporary" intermediate files permanently; place
           them in the current directory and name them based on the source
           file.  Thus, compiling foo.c with -c -save-temps produces files
           foo.i and foo.s, as well as foo.o.  This creates a preprocessed
           foo.i output file even though the compiler now normally uses an
           integrated preprocessor.

           When used in combination with the -x command-line option,
           -save-temps is sensible enough to avoid over writing an input
           source file with the same extension as an intermediate file.  The
           corresponding intermediate file may be obtained by renaming the
           source file before using -save-temps.

Následuje příklad příkazu, který vám poskytne představu, jak můžete tuto možnost použít:

gcc -Wall -save-temps test.c -o test-exec

A takto jsem ověřil, že všechny přechodné soubory byly skutečně vytvořeny po provedení výše uvedeného příkazu:

Jak tedy můžete vidět na snímku obrazovky výše, test.i , test.s a test.o soubory byly vytvořeny pomocí -save-temps volba. Tyto soubory odpovídají fázím předběžného zpracování, kompilace a propojení.

Připravte si ladění kódu a profilování

Existují speciální nástroje, které vám umožní ladit a profilovat váš zdrojový kód. Například gdb se používá pro účely ladění, zatímco gprof je oblíbený nástroj pro účely profilování. Ale víte, že existují specifické možnosti příkazového řádku, které gcc nabízí, aby bylo připraveno ladění kódu i profilování?

Začněme s laděním. Abyste mohli používat gdb pro ladění kódu, musíte svůj kód zkompilovat pomocí -g možnost příkazového řádku poskytla kompilátor gcc. Tato možnost v zásadě umožňuje gcc vytvářet ladicí informace, které gdb vyžaduje k úspěšnému ladění vašeho programu.

V případě, že plánujete použít tuto možnost, doporučujeme vám projít si podrobnosti, které k této možnosti nabízí manuálová stránka gcc – některé z nich mohou být v některých případech životně důležité. Například následující je výňatek převzatý z manuálové stránky:

           GCC allows you to use -g with -O.  The shortcuts taken by optimized
           code may occasionally produce surprising results: some variables
           you declared may not exist at all; flow of control may briefly move
           where you did not expect it; some statements may not be executed
           because they compute constant results or their values are already
           at hand; some statements may execute in different places because
           they have been moved out of loops.

           Nevertheless it proves possible to debug optimized output.  This
           makes it reasonable to use the optimizer for programs that might
           have bugs.

Nejen gdb, kompilace kódu pomocí -g tato možnost také otevírá možnost využití Valgrindova nástroje memcheck na jeho úplný potenciál. Pro ty, kteří si toho nejsou vědomi, memcheck používají programátoři ke kontrole úniků paměti (pokud existují) v jejich kódu. Více o tomto nástroji se můžete dozvědět zde.

Abyste mohli používat gprof pro profilování kódu, musíte svůj kód zkompilovat pomocí -pg možnost příkazového řádku. Umožňuje gcc generovat extra kód pro zápis profilovacích informací, které gprof vyžaduje pro analýzu kódu. „Tuto možnost musíte použít při kompilaci zdrojových souborů, o kterých chcete data, a musíte ji použít také při propojování,“ říká manuálová stránka gcc. Chcete-li se dozvědět více o tom, jak provádět profilování kódu pomocí gprof, přejděte na tento vyhrazený návod na našem webu.

Poznámka :Použití obou -g a -pg možnosti jsou podobné jako u -save-temps možnost byla použita v předchozí části.

Závěr

Pokud nejste profík gcc, jsem si jistý, že jste se v tomto článku naučili něco nového. Vyzkoušejte tyto možnosti a uvidíte, jak fungují. Mezitím si počkejte na další díl této série tutoriálů, kde probereme další zajímavé a užitečné možnosti příkazového řádku gcc.


Linux
  1. 12 Užitečné příklady příkazů Wget v Linuxu

  2. Užitečné možnosti ps

  3. Vysvětlete možnosti příkazu Readlink?

  1. 15 Nejčastěji používaných možností příkazového řádku kompilátoru GCC

  2. 10 užitečných příkladů kompletních příkazů Bash_Completion pro Linux (Dokončení příkazového řádku Bash na steroidech)

  3. Možnosti příkazu grub-install

  1. Možnosti příkazu dpkg-reconfigure

  2. Jak zjistit, které možnosti příkazového řádku gcc standardně předává ld?

  3. CentOS nainstaloval php72, ale příkazový řádek php nefunguje