Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
.cpp.o:
$ (CC) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<
Особая зависимость
.cpp.o:
make
$<
make
make
После запуска команда
make
-xc++
gcc
В наши дни команда
make
Самые последние версии команды make включают в себя альтернативную синтаксическую запись для достижения того же эффекта и многое другое. Например, правила с шаблонами используют знак подстановки
%
Далее приведено правило с шаблоном, эквивалентное предыдущему правилу с суффиксом .cpp:
%.cpp: %o
$(СС) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<
Управление библиотеками с помощью make
Когда вы работаете над большими проектами, часто удобно управлять компиляцией нескольких программных единиц с помощью библиотеки. Библиотеки — это файлы, в соответствии с соглашением имеющие расширение a (archive) и содержащие коллекцию объектных файлов. Для работы с библиотеками у команды make есть специальная синтаксическая запись, которая существенно облегчает управление ими.
Синтаксическая запись
lib(file.о)
make
.с.а:
$(CC) -с $(CFLAGS)
$< $(AR) $(ARFLAGS) [email protected] $*.о
Макросы
$(AR)
$(ARFLAGS)
ar
rv
make
□ первое правило говорит о том, что команда
make
□ второе правило предписывает применить команду
ar
Итак, если у вас есть библиотека fud, содержащая файл bas.o, в первом правиле
$<
[email protected]
fud.а
$*
bas
Выполните упражнение 9.4.
Правила управления библиотеками очень просто применять на практике. В этом упражнении вы измените свое приложение, сохранив файлы 2.o и 3.o в библиотеке mylib.a. Make-файл потребует лишь нескольких изменений и его новый вариант Makefile5 будет выглядеть следующим образом:
all: myapp
# Какой компилятор
CC = gcc
# Куда установить
INSTDIR = /usr/local/bin
# Где хранятся файлы include
INCLUDE =
# Опции для разработки
CFLAGS = -g -Wall -ansi
# Опции для рабочей версии
# CFLAGS = -O -Wall -ansi
<i># Локальные библиотеки</i>
<i>MYLIB = mylib.a</i>
<i>myapp: main.o $(MYLIB)</i>
<i> $(CC) -o myapp main.o $(MYLIB)</i>
<i>$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)</i>
<i>main.o: main.c a.h</i>
<i>2.o: 2.c a.h b.h</i>
<i>3.o: 3.c b.h c.h</i>
<i>clean:</i>
<i> -rm main.o 2.o 3.o $(MYLIB)</i>
install: myapp
@if [ -d $(INSTDIR) ];
then
cp myapp $(INSTDIR);
chmod a+x $(INSTDIR)/myapp;
chmod og-w $(INSTDIR)/myapp;
echo "Installed in $(INSTDIR)";
else
echo "Sorry, $(INSTDIR) does not exist";
fi
Обратите внимание на то, как вы разрешили правилам по умолчанию выполнить большую часть работы. Теперь проверьте новую версию make-файла:
$ <b>rm -f myapp *.o mylib.a</b>
$ <b>make -f Makefile5</b>
gcc -g -Wall -ansi -с -o main.о main.c
gcc -g -Wall -ansi -с -o 2.о 2.c
ar rv mylib.a 2.o