Швидкий старт
Тут ми розглянемо лише роботу з 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