|
Kompilace
|
|
27.01.2006
Překlad C++ prochází přes preprocesor, kompilátor a linker.
Preprocesor
interpretuje makra a direktivy jako
#include
#ifndef
Kompilátor
zkompiluje zdrojové kódy
*.cpp
do modulů
*.o
Provádí kontrolu syntaxe.
Linker
spojuje
*.o
soubory do výsledné binárky.
Kompilaci více souborů provádíme například takto:
$ g++ -Wall -W -c hello.cpp
$ g++ -Wall -W -c main.cpp
$ g++ -Wall -W main.o hello.o -o program
Zdrojáky:
hello.h
#pragma once
class CHello
{
public:
void Print();
};
hello.cpp
#include "hello.h"
#include <stdio.h>
void CHello::Print()
{
printf("Hello vole \n");
}
main.cpp
#include "hello.h"
int main(int, char *[])
{
CHello kHello;
kHello.Print();
return 0;
}
Parametry:
-Wall
vypisuje varování na jednoznačné chyby
-W
vypisuje varování na možné chyby
-c
vytvoří modul *.o
-o program
uloží výstup pod názvem program
Další parametry:
-O2
optimalizace
-D DEBUG
makro pro debug
|
Make
|
|
Program make slouží k automatické kompilaci. Make ze souboru
makefile
zjistí co je potřeba pro zkompilování projektu. Nevytváří zbytečně
*.o
moduly pro nezměněné zdrojové soubory.
Příklad souboru
makefile
program: main.o hello.o
g++ -Wall -W $^ -o $@
main.o: main.cpp hello.h
hello.o: hello.cpp hello.h
%.o: %.cpp
g++ -Wall -W -c $<
provede předešlou kompilaci automaticky. Stačí zadat příkaz
make
Značky znamenají:
$^
Jména všech předpokladů oddělená mezerami
$@
Jméno cíle
$<
Jméno prvního předpokladu
$?
Jména předpokladů jenž jsou novější než cíl
Parametry funkce make.
Parametry se zapisují do souboru makefile například:
debug:
Pokud zadáme do konzole
make debug
tak se provede vše, co je za
debug:
Defaultní přepínače.
make -f soubor
použije "soubor" místo "makefile"
make -n
nic se nevykonává, jen vypisuje průběh
make -p
vypisuje všechny parametry a proměnné
|
Statické a dynamické knihovny.
|
|
Dynamická
knihovna se vytvoří
g++ - Wall -W main.o hello.o -shared -fPIC -o program.so
Zkratka PIC označuje Position-Independent Code(kód nezávislý na pozici). Co to znamená? Funkce ve sdílené knihovně mohou být zavedeny do paměti na různých pozicích. Proto kód těchto funkcí nesmí záviset na pozici v paměti.
Statická
knihovna se vytvoří přídáním dalšího řádku
ar rcs program.a program.so
Když se zadá
ldd
před dynamickou knihovnu např.
ldd K3dEngine.so
tak se vypíšou závislosti na dalších knihovnách
home
/
g++