Programowanie w systemie UNIX/Kompilacja

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania

Kompilacja[edytuj]

etapy[edytuj]

Etapy kompilacji

Głowne 4 etapy:


Zachowanie plików pośrednich :[1]

 gcc -save-temps


Wywołanie poszczególnych etapów z linii poleceń

 gcc -E -o p.i p.c //pre-processing step
 gcc -S -o p.s p.i // kompilacja do kodu assemblera
 gcc -c -o p.o p.s // assemblacja do kodu obiektowego, inaczej:  as -o p.o p.s
 gcc p.c //

W praktyce najczęściej korzystamy z:

  • 1 etapu ( proste projekty)
  • 2 etapów ( złożóne projekty - w celu optymalizacji kompilacji)[2]

gcc - ręczna kompilacja[edytuj]

Jest kilka sposobów [3]


jeden plik[edytuj]

Najprostszy program

Najprostsza kompilacja programu skłądajacego sie z 1 plikku możemy dokonać za pomocą:

  • 1 komendy z linii poleceń
  • użycia Make[4]


linia poleceń[edytuj]

Plik z kodem programu, np. p.c skompiluj za pomocą komendy:

gcc p.c

Otrzymasz plik a.out (standardowa nazwa)

  • uruchom za pomocą:
./a.out


Możesz zmienić nazwę generowanego pliku. W tym celu skompiluj go za pomocą komendy:

gcc p.c -o p.out
  • uruchom za pomocą:
./p.out

Możesz włączyć wszystkie ostrzeżenia (ang. Warnings all)

gcc -Wall p.c


make[edytuj]

Plik makefile z wykorzystaniem 1 etapowej kompilacji

all:
    gcc p.c

z użyciem zmiennych:

# variables
SHELL = /bin/bash
CC = gcc	# compiler to use
CFLAGS = -Wall	# Extra flags to give to the C compiler
SOURCES=p.c
all:
	$(CC) $(SOURCES) $(CFLAGS)


Plik makefile z wykorzystaniem 2 etapowej kompilacji:

all: a.out

# conversion from object to executable
a.out: p.o
	 gcc p.o

# conversion from source file to object file
p.o: p.c
	 gcc -c p.c

#     
clean:
	 rm p.o

kilka plików[edytuj]

kilka plików programu[edytuj]

kilka plików programu
kilka plików programu

Możemy skompilować ręcznie:[5]

  • w 1 poleceniu
  • w osobnych poleceniach
  • za pomocą make

Jedno polecenie:

 gcc 1.c 2.c


Kilka poleceń:[6]

  gcc -c 1.c // c do obj
  gcc -c 2.c // c do obj
  gcc 1.o 2.o // obj do bin

biblioteki[edytuj]

Na przykładzie biblioteki matematycznej libm w wersji:

  • statycznej (zwykle /usr/lib/libm.a) i pliku nagłówkowym math.h (zwykle /usr/include/math.h)
  • ładowanej dynamicznie (/usr/lib/libm.so)

Aby skorzystać z tej biblioteki należy :

  • dodać w pliku p.c: #include <math.h>
  • w czasie kompilacji dołączyć bibliotekę libm: gcc p.c -lm

Narzędzia do kompilacji[edytuj]

Make[edytuj]

Program make jest nadzorcą kompilacji. Wykorzystuje plik reguł kompilacji nazywany zazwyczaj "makefile" i na jego podstawie decyduje które ze składników wielo-źródłowego programu muszą być skompilowane ponownie. Do oceny tego faktu używa pliku reguł i czasu modyfikacji plików. Aby skompilować swój program wprowadź komendę :

make

debug[edytuj]

Debugowanie pliku makefile:[7]

  • make -d ( Print debugging information )
  • make - n
  • make -np
  • make -nd
  • użycie info w pliku makefile


Formatowanie pliku makefile sprawdzimy za pomocą: [8]

  cat -e -t -v makefile

W wyniku:

  • tabulatory jako ^I
  • końcówki linii jako $

autoconf[edytuj]

Typowo:

./configure
make
make install

ale możliwa jest optymalizacja dla procesorów wielordzeniowych:[9]

./configure
make -j 2 # zamień 2 na liczbę rdzeni twojego procesora
make install


Automake[edytuj]

Automake czyta plik Makefile.am i tworzy plik Makefile.in

Ant[edytuj]

Apache Ant jest to narządzie do budowania programów [10]

Optymalizacja[edytuj]

Można przyspieszyć działanie programu przez odpowiednią kompilację [11] (opcje) i przetestowanie efektu. Np. dodanie opcji kompilacji:

-O3 -funroll-loops

lub

-O2

może dać 2-krotne skrócenie czasu wykonania programu. Porównaj efekty zaawansowanej optymalizacji tutaj [12]

Inne opcje:

-mtune=native 

generuje kod dostrojony do aktualnego procesora (na innym też się uruchomi).

-march=native

wykorzystuje wszystkie instrukcje używanego procesora (jeżeli inny procesor ich nie obsługuje, kod nie będzie działał).

Za pomocą instrukcji:

 gcc -O3 -Q --help=optimizers | grep disabled

sprawdzamy wszystkie wyłączone opcje. Przykładowy wynik:

  -fbranch-probabilities      		[disabled]
  -fbranch-target-load-optimize 	[disabled]
  -fbranch-target-load-optimize2 	[disabled]
  -fbtr-bb-exclusive          		[disabled]
  -fconserve-stack            		[disabled]
  -fcx-fortran-rules          		[disabled]
  -fcx-limited-range          		[disabled]
  -fdata-sections             		[disabled]
  -fdelayed-branch            		[disabled]
  -fexceptions                		[disabled]
  -ffinite-math-only          		[disabled]
  -ffloat-store               		[disabled]
  -fgcse-las                  		[disabled]
  -fgcse-sm                   		[disabled]
  -fgraphite-identity         		[disabled]
  -fipa-pta                   		[disabled]
  -floop-block                		[disabled]
  -floop-interchange          		[disabled]
  -floop-nest-optimize        		[disabled]
  -floop-parallelize-all      		[disabled]
  -floop-strip-mine           		[disabled]
  -fmerge-all-constants       		[disabled]
  -fmodulo-sched              		[disabled]
  -fnon-call-exceptions       		[disabled]
  -fnothrow-opt               		[disabled]
  -fomit-frame-pointer        		[disabled]
  -fopt-info                  		[disabled]
  -fpack-struct               		[disabled]
  -fpeel-loops                		[disabled]
  -freg-struct-return         		[disabled]
  -freorder-blocks-and-partition 	[disabled]
  -freschedule-modulo-scheduled-loops 	[disabled]
  -frounding-math             		[disabled]
  -fsched-pressure            		[disabled]
  -fsched-spec-load           		[disabled]
  -fsched-spec-load-dangerous 		[disabled]
  -fsched-stalled-insns       		[disabled]
  -fsched2-use-superblocks    		[disabled]
  -fschedule-insns            		[disabled]
  -fsection-anchors           		[disabled]
  -fsel-sched-pipelining      		[disabled]
  -fsel-sched-pipelining-outer-loops 	[disabled]
  -fsel-sched-reschedule-pipelined 	[disabled]
  -fselective-scheduling      		[disabled]
  -fselective-scheduling2     		[disabled]
  -fshort-double              		[disabled]
  -fshort-wchar               		[disabled]
  -fsignaling-nans            		[disabled]
  -fsingle-precision-constant 		[disabled]
  -fstrict-enums              		[disabled]
  -ftrapv                     		[disabled]
  -ftree-coalesce-inlined-vars 		[disabled]
  -ftree-loop-distribution    		[disabled]
  -ftree-loop-if-convert-stores 	[disabled]
  -ftree-lrs                  		[disabled]
  -funroll-all-loops          		[disabled]
  -funroll-loops              		[disabled]
  -funsafe-loop-optimizations 		[disabled]
  -funsafe-math-optimizations 		[disabled]
  -funwind-tables             		[disabled]
  -fvar-tracking-assignments-toggle 	[disabled]
  -fvar-tracking-uninit       		[disabled]
  -fvariable-expansion-in-unroller 	[disabled]
  -fvpt                       		[disabled]
  -fwhole-program             		[disabled]
  -fwrapv                     		[disabled]

Opcje obliczeń zmiennoprzecinkowych [13]

Testowanie programu[edytuj]

Są 2 metody: [14]

Program Time[edytuj]

gcc -o prog main.c
time prog

Przykład użycia:

Testujemy ile czasu zajmie 4000 razy wypisanie tekstu (przykładowy kod):

const int iXmax = 4000;
const int iYmax = 4000;
  for(iY=0;iY<iYmax;++iY)
   {
     printf("iY/iYmax =   %d / %d \n", iY, iYmax);
     for(iX=0;iX<iXmax;++iX){}
   }

Skompilowany:

  gcc s.c -lm

Uruchomiony:

  time ./a.out
  real    0m0.267s
  user    0m0.120s
  sys    0m0.040s

Jeśli usuniemy komendę printf:

real    0m0.150s
user    0m0.140s
sys    0m0.020s

Różnica około 0.150 sekundy

Program gprof[edytuj]

Opis gprof

Kompilacja z opcją -pg powoduje, że po wykonaniu skompilowanego programu zostaną zapisanie do pliku gmon.out czasy wykonania poszczególnych funkcji

gcc -o prog main.c -pg
./proggprof prog > test1.prof

lub

gcc -o prg source.c -pg
gprof prg > gprof.out

Zobacz również[edytuj]

Bibliografia[edytuj]

  1. gcc online docs : Developer-Options save-temps
  2. stackoverflow question : trouble-with-c-compilation-via-gcc-command-line
  3. Building C programs on Linux from LinuxQuestions.org
  4. stackoverflow question: how-to-write-a-makefile-to-compile-a-simple-c-program
  5. Compiling-multiple-files - The GNU C Programming Tutorial
  6. GCC and Make Compiling, Linking and Building C/C++ Applications by Chua Hock-Chuan
  7. Managing Projects with GNU Make, Third Edition The Power of GNU Make for Building Anything By Robert Mecklenburg November 2004
  8. stackoverflow question: makefile4-missing-separator-stop
  9. Speed-up compile (make) time on dual-core (or multi-core) processor!
  10. Strona domowa Apache Ant
  11. Algorytmy przetwarzania obrazów i wstęp do pracy z biblioteką OpenCV Pod redakcją Ewarysta Rafajłowicza, Wojciecha Rafajłowicza i Andrzeja Rusieckiego
  12. The Computer Language Benchmarks Game
  13. Semantics of Floating Point Math in GCC
  14. gcc-function-for-find-execution-time - dyskusja na gamedev