G++

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++


Valid XHTML 1.0 Transitional