gccRozpoczęcie pracy z gcc


Uwagi

GCC (wielkie litery) oznacza kolekcję kompilatorów GNU. Jest to pakiet kompilatorów typu open source, który obejmuje kompilatory dla C, C ++, Objective C, Fortran, Ada, Go i Java. gcc (małe litery) to kompilator C w kolekcji kompilatorów GNU. Historycznie GCC i gcc były używane zamiennie, ale starano się rozdzielić te dwa terminy, ponieważ GCC zawiera narzędzia do kompilacji większej niż C.

Dokumentacja w tej sekcji będzie odnosić się do gcc, kompilatora GNU C. Ma to na celu szybkie sprawdzenie typowych działań i opcji. Projekt GCC ma szczegółową dokumentację na https://gcc.gnu.org, która dokumentuje instalację, ogólne użycie i każdą opcję wiersza poleceń. Proszę odnieść się do oficjalnej dokumentacji GCC na każde pytanie, na które nie ma tu odpowiedzi. Jeśli określony temat w dokumentacji GCC jest niejasny, poproś o konkretne przykłady.

Wersje

Wersja Data wydania
7.1 02.05.2017
6.3 21.12.2016
6.2 22.08.2016
5.4 2016-06-03
6.1 27.04.2016
5.3 04.12.2015
5.2 2015-07-16
5.1 2015-04-22
4.9 22.04.2014
4.8 22.03.2013
4.7 22.03.2012
4.6 25.03.2011
4.5 14.04.2010
4.4 21.04.2009
4.3 2008-03-05
4.2 2007-05-13
4.1 28.02.2006
4.0 2005-04-20
3.4 2004-04-18
3.3 2003-05-13
3.2 2002-08-14
3.1 2002-05-15
3.0 2001-06-18
2,95 1999-07-31
2.8 1998-01-07
2.7 1995-06-16
2.6 1994-07-14
2.5 1993-10-22
2.4 1993-05-17
2.3 1992-10-31
2.2 1992-06-08
2.1 1992-03-24
2.0 1992-02-22
1.42 1992-09-20
1.41 1992-07-13
1,40 1991-06-01
1,39 1991-01-16
1.38 1990-12-21
1,37 1990-02-11
1,36 1989-09-24
1,35 1989-04-26
1.34 1989-02-23
1.33 1989-02-01
1,32 1988-12-21
1.31 1988-11-19
1,30 1988-10-13
1.29 1988-10-06
1,28 1988-09-14
1,27 1988-09-05
1,26 1988-08-18
1,25 1988-08-03
1.24 1988-07-02
1.23 1988-06-26
1.22 1988-05-22
1.21 1988-05-01
1.20 1988-04-19
1.19 1988-03-29
1.18 1988-02-04
1.17 1988-01-09
1.16 1987-12-19
1.15 1987-11-28
1.14 1987-11-06
1.13 1987-10-12
1.12 1987-10-03
1.11 1987-09-05
1.10 1987-08-22
1.9 1987-08-18
1.8 1987-08-10
1.7 1987-07-21
1.6 1987-07-02
1.5 1987-06-18
1.4 1987-06-13
1.3 1987-06-10
1.2 1987-06-01
1.1 1987-05-24
1.0 1987-05-23
0,9 1987-03-22

"Witaj świecie!" z typowymi opcjami wiersza poleceń

W przypadku programów z jednym plikiem źródłowym użycie gcc jest proste.

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}
 

Aby skompilować plik hello_world.c z wiersza poleceń:

gcc hello_world.c
 

gcc następnie skompiluje program i wyśle plik wykonywalny do pliku a.out. Jeśli chcesz nazwać plik wykonywalny, użyj opcji -o.

gcc hello_world.c -o hello_world
 

Plik wykonywalny zostanie wtedy nazwany hello_world zamiast a.out. Domyślnie gcc nie emituje tak wielu ostrzeżeń. gcc ma wiele opcji ostrzeżeń i warto przejrzeć dokumentację gcc, aby dowiedzieć się, co jest dostępne. Użycie „-Wall” jest dobrym punktem wyjścia i obejmuje wiele typowych problemów.

gcc -Wall hello_world.c -o hello_world
 

Wynik:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^
 

Widzimy, że teraz otrzymujemy ostrzeżenie, że zmienna „i” została zadeklarowana, ale w ogóle nie została użyta w funkcji.

Jeśli planujesz użyć debugera do testowania programu, musisz powiedzieć gcc, aby zawierał informacje debugowania. Użyj opcji „-g” do obsługi debugowania.

gcc -Wall -g hello_world.c -o hello_world
 

hello_world ma teraz dostępne informacje debugowania obsługiwane przez GDB. Jeśli używasz innego debugera, może być konieczne użycie różnych opcji debugowania, aby wynik był poprawnie sformatowany. Zobacz oficjalną dokumentację gcc, aby uzyskać więcej opcji debugowania.

Domyślnie gcc kompiluje kod, dzięki czemu można go łatwo debugować. gcc może zoptymalizować dane wyjściowe, tak aby końcowy plik wykonywalny dawał ten sam wynik, ale ma większą wydajność i może powodować, że plik wykonywalny ma mniejszy rozmiar. Opcja „-O” umożliwia optymalizację. Istnieje kilka uznanych kwalifikatorów, które należy dodać po O, aby określić poziom optymalizacji. Każdy poziom optymalizacji dodaje lub usuwa ustawioną listę opcji wiersza poleceń. „-O2”, „-Os”, „-O0” i „-Og” są najczęstszymi poziomami optymalizacji.

gcc -Wall -O2 hello_world.c -o hello_world
 

„-O2” jest najczęstszym poziomem optymalizacji kodu gotowego do produkcji. Zapewnia doskonałą równowagę między wzrostem wydajności a ostatecznym rozmiarem pliku wykonywalnego.

gcc -Wall -Os hello_world.c -o hello_world
 

„-Os” jest podobne do „-O2”, z wyjątkiem niektórych optymalizacji, które mogą zwiększyć szybkość wykonywania poprzez zwiększenie rozmiaru pliku wykonywalnego. Jeśli końcowy rozmiar pliku wykonywalnego ma dla Ciebie znaczenie, spróbuj „-Os” i sprawdź, czy istnieje zauważalna różnica wielkości w końcowym pliku wykonywalnym.

gcc -Wall -g -Og hello_world.c -o -hello_world
 

Zauważ, że w powyższych przykładach z „-Os” i „-O2” opcja „-g” została usunięta. Dzieje się tak dlatego, że kiedy zaczynasz mówić kompilatorowi, aby zoptymalizował kod, niektóre wiersze kodu mogą zasadniczo nie istnieć w końcowym pliku wykonywalnym, co utrudnia debugowanie. Jednak zdarzają się również przypadki, w których pewne błędy występują tylko przy włączonych optymalizacjach. Jeśli chcesz debugować aplikację i zoptymalizować kod przez kompilator, wypróbuj opcję „-Og”. To mówi gcc, aby wykonał wszystkie optymalizacje, które nie powinny utrudniać debugowania.

gcc -Wall -g -O0 hello_world.c -o hello_world
 

„-O0” wykonuje jeszcze mniej optymalizacji niż „-Og”. Jest to poziom optymalizacji używany domyślnie przez gcc. Użyj tej opcji, jeśli chcesz się upewnić, że optymalizacje są wyłączone.

Określ wersję gcc

Odnosząc się do dokumentacji gcc, powinieneś wiedzieć, którą wersję gcc używasz. Projekt GCC ma instrukcję dla każdej wersji gcc, która zawiera funkcje zaimplementowane w tej wersji. Użyj opcji -v, aby określić wersję uruchomionej gcc.

gcc -v
 

Przykładowe dane wyjściowe:

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
 

W tym przykładzie widzimy, że korzystamy z gcc w wersji 5.3.1. W takim przypadku powinieneś zapoznać się z instrukcją GCC 5.3. Przy zadawaniu pytań pomocne jest również podanie wersji gcc na wypadek problemów z wersją.