Швидкий старт

Тут ми розглянемо лише роботу з gcc як з GNU компілятором C. Це й зрозуміло, адже осягнути всю колекцію компіляторів GNU -- мало кому по зубах.

Отож маємо простеньку програмку типу "hello world" в файлі hello.c (оскільки саму мову програмування пояснювати не збираюсь -- код програми писати не буду) і її потрібно скомпілювати.

Для цього ми набираєм в командній строці gcc hello.c і маєм вихідний файл a.out. Звісно, його можна перейменувати як завгодно, але ж то - не цікаво: ми хочемо одразу створити файл hello, для цього можна просто задати назву результуючого файлу: gcc hello.c -o hello

Ми навчились писати програму і компілювати її в бінарний файл з заданим ім'ям, але нам цього мало: ми хочем цілу пачку файлів об'єднати в одну програму. Це - досить просто для кожного файлу виконуєм gcc filename.c -c, потім результуючі файли з розширенням .o об'єднуєм в бінарника: gcc *.o -o my_program

Створення статичних бібліотек

А набіса вони вам?

Створення динамічних бібліотек

Розглянемо приклад типового Make-файла (передер прямо зі свого проекту ;) ) для створення динамічної бібліотеки

GCC_FLAGS=-I$(HOME)/include -ggdb
GCC_LIBS=-L$(HOME)/bin -lvmath
OBJS= rdd.o grf.o sfd.o utils.o cell.o
liboqfa.so :$(OBJS)
        gcc  --shared  $(GCC_LIBS) -oliboqfa.so $(OBJS)
grf.o: grf.c
        gcc -c $(GCC_FLAGS) grf.c -fPIC
cell.o: cell.c
        gcc -c $(GCC_FLAGS) cell.c -fPIC
sfd.o: sfd.c
        gcc -c $(GCC_FLAGS) sfd.c -fPIC
rdd.o: rdd.c
        gcc -c  $(GCC_FLAGS) rdd.c -fPIC
utils.o: utils.c
        gcc -c $(GCC_FLAGS) utils.c -fPIC
engine.o: engine.c
        gcc -c $(GCC_FLAGS) engine.c -fPIC

і одразу стає зрозуміло, що для того, щоб створити динамічну бібліотеку потрібно об'єктні файли (файли з розширенням .o, які збираються з опцією -c ) збирати з додатковою опцією -fPIC (Position Independed Code) ну і саму бібліотеку в кінці збирають з опцією --shared

Ну і на останок варто ще до дати, що динамічні бібліотеки мають імена lib*.so де *-вигадане вами ім'я. Під'єднуються бібліотеки (динамічні і не дуже) опцією -l, за якою йде ім'я бібліотеки (без префікса lib і розширення .so) Шлях до директорії, де лежать ваші бібліотеки задається опцією -L за якою йде повний шлях до каталогу з бібліотеками. Якщо ваші бібліотеки лежать в несистемному каталозі - шлях до них треба вказати в змінній оточення LD_LIBRARY_PATH, наприклад: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/bin в файлі ~/.bashrc