Самьюэл Алекс
Шрифт:
# Совместно используемые библиотеки серверных модулей.
MODULES = diskfree.so issue.so processes.so time.so
### Правила. ####################################################
# Служебный целевой модуль.
.PHONY: all clean
# Стандартный целевой модуль: компиляция всех файлов.
all: server $(MODULES)
# Удаление всех компонентов.
clean:
rm -f $(OBJECTS) $(MODULES) server
# Главная серверная программа, должна компоноваться с флагами
# -Wl,-export-dynamic, чтобы динамически загружаемые модули могли
# находить в программе символические константы. Подключается также
# библиотека libdl, в которой находятся функции динамической
# загрузки.
server: $(OBJECTS)
$(CC) $(CFLAGS) Wl,-export-dynamic -о $@ $^ -ldl
# Все объектные файлы сервера зависят от файла server.h.
# Используем стандартное правило создания объектных файлов из
# исходных файлов.
$(OBJECTS): server.h
# Правило создания совместно используемых библиотек из
# соответствующих исходных файлов, компилируем с флагом -fPIC и
# генерируем совместно используемый объектный файл.
$(MODULES): \
%.so: %.c server.h
$(CC) $(CFLAGS) -fPIC -shared -o $@ $<
В файле
Makefile
есть следующие целевые модули. ■ Модуль
all
(используется по умолчанию при вызове файла Makefile
без аргументов, так как стоит первым) содержит исполняемый файл server
и все серверные модули. Последние перечислены в переменной MODULES
. ■ Модуль
clean
предназначен для удаления всех скомпилированных компонентов. ■ Модуль
server
подключает к проекту исполняемый файл сервера. Компилируются и компонуются исходные файлы, перечисленные в переменной SOURCES
. ■ Последнее правило представляет собой шаблон компиляции совместно используемых файлов серверных модулей.
Обратите внимание на то, что исходные файлы серверных модулей компилируются с флагом
– fPIC
, так как они включаются в совместно используемые библиотеки (см. раздел 2.3.2, "Совместно используемые библиотеки"). Исполняемый файл
server
компонуется с флагом – Wl,-export-dynamic
. Благодаря этому файл будет экспортировать свои символические константы, что позволит динамически загружаемым модулям ссылаться на функции, находящиеся в файле common.c
. 11.4.2. Создание сервера
Построить исполняемый файл несложно. Перейдите в каталог, содержащий исходные файлы, и вызовите команду
make
: % make
cc -Wall -g -с -o server.о server.с
cc -Wall -g -с -o module.о module.с
cc -Wall -g -с -o common.о common.с
cc -Wall -g -с -o main.o main.c
cc -Wall -g -Wl,-export-dynamic -o server server.о module.о
common.о main.o -ldl
cc -Wall -g -fPIC -shared -o diskfree.so diskfree.c
cc -Wall -g -fPIC -shared -o issue.so issue.с
cc -Wall -g -fPIC -shared -o processes.so processes.с
cc -Wall -g -fPIC -shared -o time.so time.с
В результате будут созданы программа
server
и совместно используемые библиотеки серверных модулей: % ls -l server *.so
– rwxr-xr-x 1 samuel samuel 25769 Mar 11 01:15 diskfree.so
– rwxr-xr-x 1 samuel samuel 31184 Mar 11 01:15 issue.so
– rwxr-xr-x 1 samuel samuel 41579 Mar 11 01:15 processes.so
– rwxr-xr-x 1 samuel samuel 71758 Mar 11 01:15 server