Основы программирования в Linux
.cpp.o:$ (CC) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<Особая зависимость
информирует команду.cpp.o:о том, что следующие правила предназначены для трансляции файла с суффиксом .cpp в файлы с суффиксом .о. При написании этой зависимости применяются имена специальных макросов, поскольку неизвестны реальные имена файлов, которые будут транслироваться. Для того чтобы понять это правило, нужно просто вспомнить, что символыmakeзаменяются начальным именем файла (со старым суффиксом). Имейте в виду, что вы сообщили$<только о том, как получить из файла с суффиксом .cpp файл с суффиксом .о; как из объектного файла получить двоичный исполняемый файл, командаmakeуже знает.makeПосле запуска команда
применяет ваше новое правило для получения из файла bar.cpp файла bar.o; далее она использует свои встроенные правила для превращения файла с суффиксом .о в исполняемый файл. Дополнительный флагmakeдолжен сообщить программе-xc++о том, что она имеет дело с исходным файлом на языке C++.gccВ наши дни команда
знает, как работать с исходными файлами на С++ с расширениями cpp, но данный метод полезен для преобразования файла одного типа в файл другого типа.makeСамые последние версии команды make включают в себя альтернативную синтаксическую запись для достижения того же эффекта и многое другое. Например, правила с шаблонами используют знак подстановки
для сопоставления имен файлов и не полагаются на одни лишь расширения этих имен.%Далее приведено правило с шаблоном, эквивалентное предыдущему правилу с суффиксом .cpp:
%.cpp: %o$(СС) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<Управление библиотеками с помощью make
Когда вы работаете над большими проектами, часто удобно управлять компиляцией нескольких программных единиц с помощью библиотеки. Библиотеки — это файлы, в соответствии с соглашением имеющие расширение a (archive) и содержащие коллекцию объектных файлов. Для работы с библиотеками у команды make есть специальная синтаксическая запись, которая существенно облегчает управление ими.
Синтаксическая запись
означает объектный файл file.o, хранящийся в библиотеке lib.а. У командыlib(file.о)есть встроенное правило для управления библиотеками, которое обычно эквивалентно приведенному далее фрагменту:make.с.а:$(CC) -с $(CFLAGS)$< $(AR) $(ARFLAGS) [email protected] $*.оМакросы
и$(AR)подразумевают команду$(ARFLAGS)и опцииarсоответственно. Довольно краткая синтаксическая запись информирует командуrvо том, что для включения файла .с в библиотеку .а следует применить два следующих правила:make□ первое правило говорит о том, что команда
должна откомпилировать исходный файл и сформировать объектный файл;make□ второе правило предписывает применить команду
для модификации библиотеки, заключающейся в добавлении нового объектного файла.arИтак, если у вас есть библиотека fud, содержащая файл bas.o, в первом правиле
заменяется именем bas.c. Во втором правиле$<заменяется именем библиотеки[email protected]иfud.азаменяется именем$*.basВыполните упражнение 9.4.
Упражнение 9.4. Управление библиотекойПравила управления библиотеками очень просто применять на практике. В этом упражнении вы измените свое приложение, сохранив файлы 2.o и 3.o в библиотеке mylib.a. Make-файл потребует лишь нескольких изменений и его новый вариант Makefile5 будет выглядеть следующим образом:
all: myapp# Какой компиляторCC = gcc# Куда установитьINSTDIR = /usr/local/bin# Где хранятся файлы includeINCLUDE =# Опции для разработки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.cgcc -g -Wall -ansi -с -o 2.о 2.car rv mylib.a 2.o