Język C jest językiem kompilowanym, co oznacza, że potrzebuje specjalnego programu - kompilatora - który tłumaczy kod źródłowy, pisany przez człowieka, na język rozkazów danego komputera. W skrócie działanie kompilatora sprowadza się do czytania tekstowego pliku z kodem programu, raportowania ewentualnych błędów i produkowania pliku wynikowego.
Kompilatory
Kompilator uruchamiamy: ze zintegrowanego środowiska programistycznego (ang. IDE) z konsoli (linii poleceń) online
Przejść do konsoli można dla systemów: typu UNIX w trybie graficznym użyć programów gnome-terminal, konsole albo xterm, Windows "Wiersz polecenia" (można go znaleźć w menu Akcesoria albo uruchomić wpisując w Start -> Uruchom... "cmd").
Lista kompilatorów w ang. wikipedii
GCC
GCC (ang. GNU Compiler Collection)GCC (ang. GNU Compiler Collection) jest to darmowy zestaw kompilatorów, m.in. języka C (gcc) rozwijany w ramach projektu GNU. Dostępny jest on na dużą ilość platform sprzętowych, obsługiwanych przez takie systemy operacyjne jak: AIX, *BSD, Linux, Mac OS X, SunOS, Windows. Na niektórych systemach (np. Windows) nie jest on jednak dostępny automatycznie. Należy zainstalować odpowiednie narzędzia (poprzedni rozdział).
Zmienne środowiska
W bashu:
export CC="gcc" CFLAGS="-O3 -Wall"
W csh:
setenv CC "gcc"
Możesz dodać to polecenie do pliku ~/.bashrc, aby ustawić to ustawienie na stałe.
Wersja kompilatora gcc --version
Otrzymujemy (przykładowy wynik):
gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
lub w c :nadeausoftware : C/C++ tip: How to detect the compiler name and version using compiler predefined macros gcc.gnu.org onlinedocs : Common-Predefined-Macros.html
#include #include
int main() { printf("GCC_VERSION = %d.%d.%d \n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); return 0; }
Przykładowy wynik :
GCC_VERSION = 4.8.4
Scieżki
Z pomocą komendy:CONTROLLING #INCLUDE IN C++ by BRIAN FITZGERALD
echo "//" | gcc -xc++ -E -v -
przykładowy wynik :
Using built-in specs. COLLECT_GCC=gcc Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1plus -E -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE - -mtune=generic -march=x86-64 -fstack-protector -Wformat -Wformat-security ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/4.8" ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include search starts here: /usr/include/c++/4.8 /usr/include/x86_64-linux-gnu/c++/4.8 /usr/include/c++/4.8/backward /usr/lib/gcc/x86_64-linux-gnu/4.8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. # 1 "" # 1 "" # 1 "" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "" 2 # 1 "" COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=x86-64'
Lista : COMPILER_PATH LIBRARY_PATH C_INCLUDE_PATH
Z użyciem tylko gcc stackoverflow question: what-are-the-gcc-default-include-directories
gcc -E -Wp,-v -xc /dev/null
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/11/include-fixed" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/11/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include search starts here: /usr/lib/gcc/x86_64-linux-gnu/11/include /usr/local/include /usr/include/x86_64-linux-gnu /usr/include End of search list. # 0 "/dev/null" # 0 "" # 0 "" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 0 "" 2 # 1 "/dev/null"
Symbole Lista symboli compilatora :Commands using gcc
gcc -dM -E - < /dev/null
Plik wynikowy Za pomocą komendy file sprawdzamy plik wynikowy:
file a.out
Przykładowy wynik:
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x4f7368b40e4eeee54307e8491e0f2ace1405d841, not stripped
Możemy również użyć komendy: readlfDive into ELF files using readelf command by Himanshu Arora
biblioteki
Za pomocą komendy ldd sprawdzamy jakich bibliotek używa plik wynikowy:
ldd a.out
przykładowy wynik:
linux-vdso.so.1 => (0x00007fff4ad68000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc5c7758000) libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007fc5c7549000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc5c732b000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc5c6f63000) /lib64/ld-linux-x86-64.so.2 (0x00007fc5c7a7f000)
flagi -L ( od ang Library) - pokazuje katalog gdzie są pliki binarne biblioteki -E - powoduje wygenerowanie kodu programu ze zmianami, wprowadzonymi przez preprocesor -S - zamiana kodu w języku C na kod asemblera (komenda: gcc -S plik.c spowoduje utworzenie pliku o nazwie plik.s, w którym znajdzie się kod asemblera) -c - kompilacja bez łączenia z bibliotekami -Ikatalog - ustawienie domyślnego katalogu z plikami nagłówkowymi na katalog, (duża litera i, od ang. Include) -lbiblioteka - (mała litera l) : wymusza łączenie programu z podaną biblioteką = dołącza skompilowaną bibliotekę (np. -lGL) -M = opcja preprocesora powodująca wypisanie ( dodanie do pliku Makefile) wymaganych opcji kompilacji. Jest używnaie przez gccmakedep program
Typowe zestawy flag -Wall -Wextra -march=native -std=c99
std
Opcje sterujące dialektem Cgcc gnu ver. 13.2.0: C-Dialect-Options std pedantic ansi
Domyślny standard języka zależy od wersji kompilatorastackoverflow question: what-is-the-default-c-std-standard-version-for-the-current-gcc-especially-on-u
march
Mikroarchitektura procesora ( march )
Sprawdzamy za pomocą cat lub gcc : gentoo wiki : GCC optimization march
gcc -c -Q -march=native --help=target
przykładowy wynik :
The following options are target specific: -m128bit-long-double [disabled] -m16 [disabled] -m32 [disabled] -m3dnow [disabled] -m3dnowa [disabled] -m64 [enabled] -m80387 [enabled] -m8bit-idiv [disabled] -m96bit-long-double [enabled] -mabi= sysv -mabm [enabled] -maccumulate-outgoing-args [disabled] -maddress-mode= short -madx [disabled] -maes [enabled] -malign-data= compat -malign-double [disabled] -malign-functions= 0 -malign-jumps= 0 -malign-loops= 0 -malign-stringops [enabled] -mandroid [disabled] -march= haswell -masm= att -mavx [enabled] -mavx2 [enabled] -mavx256-split-unaligned-load [disabled] -mavx256-split-unaligned-store [disabled] -mavx512bw [disabled] -mavx512cd [disabled] -mavx512dq [disabled] -mavx512er [disabled] -mavx512f [disabled] -mavx512ifma [disabled] -mavx512pf [disabled] -mavx512vbmi [disabled] -mavx512vl [disabled] -mbionic [disabled] -mbmi [enabled] -mbmi2 [enabled] -mbranch-cost= 0 -mcld [disabled] -mclflushopt [disabled] -mclwb [disabled] -mcmodel= 32 -mcpu= -mcrc32 [disabled] -mcx16 [enabled] -mdispatch-scheduler [disabled] -mdump-tune-features [disabled] -mf16c [enabled] -mfancy-math-387 [enabled] -mfentry [enabled] -mfma [enabled] -mfma4 [disabled] -mforce-drap [disabled] -mfp-ret-in-387 [enabled] -mfpmath= 387 -mfsgsbase [enabled] -mfused-madd -mfxsr [enabled] -mglibc [enabled] -mhard-float [enabled] -mhle [disabled] -mieee-fp [enabled] -mincoming-stack-boundary= 0 -minline-all-stringops [disabled] -minline-stringops-dynamically [disabled] -mintel-syntax -mlarge-data-threshold= 0x10000 -mlong-double-128 [disabled] -mlong-double-64 [disabled] -mlong-double-80 [enabled] -mlwp [disabled] -mlzcnt [enabled] -mmemcpy-strategy= -mmemset-strategy= -mmmx [enabled] -mmovbe [enabled] -mmpx [disabled] -mms-bitfields [disabled] -mmwaitx [disabled] -mno-align-stringops [disabled] -mno-default [disabled] -mno-fancy-math-387 [disabled] -mno-push-args [disabled] -mno-red-zone [disabled] -mno-sse4 [disabled] -mnop-mcount [disabled] -momit-leaf-frame-pointer [disabled] -mpc32 [disabled] -mpc64 [disabled] -mpc80 [disabled] -mpclmul [enabled] -mpcommit [disabled] -mpopcnt [enabled] -mprefer-avx128 [disabled] -mpreferred-stack-boundary= 0 -mprefetchwt1 [disabled] -mprfchw [disabled] -mpush-args [enabled] -mrdrnd [enabled] -mrdseed [disabled] -mrecip [disabled] -mrecip= -mrecord-mcount [disabled] -mred-zone [enabled] -mregparm= 0 -mrtd [disabled] -mrtm [disabled] -msahf [enabled] -msha [disabled] -mskip-rax-setup [disabled] -msoft-float [disabled] -msse [enabled] -msse2 [enabled] -msse2avx [disabled] -msse3 [enabled] -msse4 [enabled] -msse4.1 [enabled] -msse4.2 [enabled] -msse4a [disabled] -msse5 -msseregparm [disabled] -mssse3 [enabled] -mstack-arg-probe [disabled] -mstack-protector-guard= tls -mstackrealign [enabled] -mstringop-strategy= [default] -mtbm [disabled] -mtls-dialect= gnu -mtls-direct-seg-refs [enabled] -mtune-ctrl= -mtune= haswell -muclibc [disabled] -mveclibabi= [default] -mvect8-ret-in-mem [disabled] -mvzeroupper [disabled] -mx32 [disabled] -mxop [disabled] -mxsave [enabled] -mxsavec [disabled] -mxsaveopt [enabled] -mxsaves [disabled]
Known assembler dialects (for use with the -masm-dialect= option): att intel
Known ABIs (for use with the -mabi= option): ms sysv
Known code models (for use with the -mcmodel= option): 32 kernel large medium small
Valid arguments to -mfpmath=: 387 387+sse 387,sse both sse sse+387 sse,387
Known data alignment choices (for use with the -malign-data= option): abi cacheline compat
Known vectorization library ABIs (for use with the -mveclibabi= option): acml svml
Known address mode (for use with the -maddress-mode= option): long short
Known stack protector guard (for use with the -mstack-protector-guard= option): global tls
Valid arguments to -mstringop-strategy=: byte_loop libcall loop rep_4byte rep_8byte rep_byte unrolled_loop vector_loop