Читать интересную книгу Основы программирования в Linux - Мэтью Нейл

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 164 165 166 167 168 169 170 171 172 ... 324

.cpp.o:

 $ (CC) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<

Особая зависимость .cpp.o: информирует команду make о том, что следующие правила предназначены для трансляции файла с суффиксом .cpp в файлы с суффиксом .о. При написании этой зависимости применяются имена специальных макросов, поскольку неизвестны реальные имена файлов, которые будут транслироваться. Для того чтобы понять это правило, нужно просто вспомнить, что символы $< заменяются начальным именем файла (со старым суффиксом). Имейте в виду, что вы сообщили make только о том, как получить из файла с суффиксом .cpp файл с суффиксом .о; как из объектного файла получить двоичный исполняемый файл, команда make уже знает.

После запуска команда make применяет ваше новое правило для получения из файла bar.cpp файла bar.o; далее она использует свои встроенные правила для превращения файла с суффиксом .о в исполняемый файл. Дополнительный флаг -xc++ должен сообщить программе gcc о том, что она имеет дело с исходным файлом на языке C++.

В наши дни команда make знает, как работать с исходными файлами на С++ с расширениями cpp, но данный метод полезен для преобразования файла одного типа в файл другого типа.

Самые последние версии команды make включают в себя альтернативную синтаксическую запись для достижения того же эффекта и многое другое. Например, правила с шаблонами используют знак подстановки % для сопоставления имен файлов и не полагаются на одни лишь расширения этих имен.

Далее приведено правило с шаблоном, эквивалентное предыдущему правилу с суффиксом .cpp:

%.cpp: %o

 $(СС) -xc++ $(CFLAGS) -I$(INCLUDE) -с $<

Управление библиотеками с помощью make

Когда вы работаете над большими проектами, часто удобно управлять компиляцией нескольких программных единиц с помощью библиотеки. Библиотеки — это файлы, в соответствии с соглашением имеющие расширение a (archive) и содержащие коллекцию объектных файлов. Для работы с библиотеками у команды make есть специальная синтаксическая запись, которая существенно облегчает управление ими.

Синтаксическая запись lib(file.о) означает объектный файл file.o, хранящийся в библиотеке lib.а. У команды 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

# Где хранятся файлы 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 &quot;Installed in $(INSTDIR)&quot;;

 else

  echo &quot;Sorry, $(INSTDIR) does not exist&quot;;

 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

1 ... 164 165 166 167 168 169 170 171 172 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

Оставить комментарий