Д. Стефенс - C++. Сборник рецептов
- Название:C++. Сборник рецептов
- Автор:
- Жанр:
- Издательство:КУДИЦ-ПРЕСС
- Год:2007
- Город:Москва
- ISBN:5-91136-030-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Д. Стефенс - C++. Сборник рецептов краткое содержание
Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.
C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Например, чтобы с помощью GCC собрать исполняемый файл из исходного кода из примера 1.4, make-файл может иметь вид, показанный в примере 1.14.
Пример 1.14. make-файл для сборки исполняемого файла с помощью GCC
# Это цель по умолчанию, которая будет собрана при
# вызове make
.PHONY: all
all: hello
# Это правило говорит make, как собрать hello из hello.cpp
hello: hello.cpp
g++ -o hello hello.cpp
# Это правило говорит make скопировать hello в поддиректорию binaries,
# создав ее, если требуется
.PHONY: install
install:
mkdir -p binaries
cp -p hello binaries
# Это правило говорит make удалить hello и hello.о
.PHONY: clean
clean:
rm -f hello
Чтобы собрать исполняемый файл из исходного кода из примера 1.4 с помощью Visual С++, используйте make-файл, показанный в примере 1.15.
Пример 1.15. make-файл для сборки исполняемого файла с помощью Visual С++.
#цель по умолчанию
.PHONY: all
all: hello.exe
#правило для сборки hello.exe
hello.exe: hello.cpp
cl -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t \
-Fehello hello.cpp
.PHONY: install
install:
mkdir -о binaries
cp -p hello.exe binaries
.PHONY: clean
clean:
rm -f hello.exe
Команды и списки целей или пререквизитов могут занимать несколько строк текста make-файла, для чего используется символ продолжения строки \, как и в исходных файлах С++.
Чтобы собрать исполняемый файл, установите переменные среды, необходимые для инструментов командной строки, перейдите в директорию, содержащую makefile , и введите make
. Чтобы скопировать исполняемый файл в поддиректорию binaries , введите make install
. Чтобы удалить из директории make-файла исполняемый файл и промежуточный объектный файл, введите make clean
.
Если вы установили среду Cygwin, описанную в рецепте 1.1, можете выполнить make-файл из примера 1.15 непосредственно из оболочки Windows cmd.exe .
Также этот make-файл можно выполнить из оболочки Cygwin, как описано далее. В cmd.exe запустите vcvars32.bat , устанавливающий переменные среды Visual С++. Затем запустите cygwin.bat, запускающий оболочку Cygwin. Если директория установки Cygwin добавлена в
PATH
, то оболочку Cygwin можно запустить из cmd.exe , просто введя cygwin. Наконец, перейдите в директорию, содержащую make-файл, и введите make
.
Аналогично можно выполнить make-файл из оболочки MSYS: в cmd.exe запустите vcvars32.bat , затем запустите msys.bat, запускающий оболочку MSYS.
Если ваш инструментарий предоставляет сценарий для установки переменных среды, запуск make-файла из Cygwin или MSYS несколько более трудоемок, чем его запуск из cmd.exe. Однако для некоторых make-файлов это обязательное условие, так как они не будут работать из-под cmd.exe .
В нескольких последующих рецептах вы увидите, что GNU make является достаточно мощным инструментом для сборки сложных проектов. Но что же она делает? Вот как она работает. При вызове make без аргументов она просматривает текущую директорию в поисках файла с именем GNUmakefile , makefile или Makefile и пытается собрать первую содержащуюся в нем цель, которая называется целью по умолчанию ( default target ). Если цель по умолчанию не устарела, что означает, что она существует, все ее пререквизиты существуют и ни один из них не был изменен с момента ее сборки, то работа make закончена. В противном случае она пытается сгенерировать цель по умолчанию из ее пререквизитов, выполнив соответствующий командный сценарий. Аналогично определению устаревания этот процесс рекурсивен: для каждого устаревшего пререквизита make ищет правило, содержащее этот пререквизит в качестве цели, и начинает весь процесс заново. Так продолжается до тех пор, пока цель по умолчанию не будет обновлена или пока не возникнет ошибка.
Из приведенного описания следует, что цель, не имеющая пререквизитов, не устаревает только в том случае, если она соответствует файлу в файловой системе. Следовательно, цель, соответствующая несуществующему файлу, всегда будет устаревшей и может использоваться для безусловного выполнения командного сценария. Такие цели называются phony targets ( фиктивными ).
Пометив цель атрибутом .PHONY, как в примерах 1.14 и 1.15, можно сказать make, что цель не соответствует файлу, и, таким образом, она всегда должна собираться заново.
И наоборот, пререквизит, соответствующий существующему файлу, никогда не устаревает при условии, что этот файл не указан в качестве цели одного из правил.
Теперь давайте посмотрим на то, что происходит при выполнении make-файла из примера 1.14. Фиктивная цель all
всегда устаревшая: единственная ее цель — сказать make собрать hello.exe . В таком простом make-файле нет необходимости в цели all
, но в более сложных примерах цель all
может иметь несколько пререквизитов, правило с целью hello
говорит make собрать, если требуется, hello с помощью g++ . Если предположить, что текущая директория не содержит ничего, кроме файлов makefile и hello.cpp , цель hello
будет устаревшей. Однако пререквизит не устарел, так как файл hello.cpp существует и так как hello.cpp
не является целью одного из правил. Следовательно, make для компиляции и компоновки hello.cpp вызывает g++ , генерируя тем самым файл hello . Пререквизит цели all
обновляется, так что make собирает цель all
— исполняя пустой командный сценарий — и выходит.
При вызове make с аргументом командной строки, соответствующим цели, make пытается собрать эту цель. Следовательно, выполнение make install
приводит к выполнению следующих команд:
mkdir -p binaries
cp -p hello binarie
s
Первая команда создает, если она не существует, директорию binaries , а вторая команда копирует в эту директорию файл hello . Точно так же make clean
вызывает команду
rm -f hello
которая удаляет hello .
При использовании Windows команды
mkdir
, cp
и rm
, используемые целями install
и clean
, указывают на инструменты GNU, поставляющиеся в составе Cygwin или MSYS
После того как вы поймете, как make анализирует зависимости, пример 1.14 покажется очень простым. Однако на самом деле он значительно сложнее, чем требуется. Рассмотрение различных методов его упрощения является хорошим способом узнать некоторые из основ make-файлов.
GNU make поддерживает переменные, чьими значениями являются строки. Наиболее часто переменные используются в make-файлах как символьные константы. Вместо того чтобы жестко указывать в нескольких местах make-файла имя файла или команды оболочки, вы можете присвоить имя файла или команды переменной и далее использовать эту переменную. Это дает возможность облегчить сопровождение make-файлов. Например, make-файл из примера 1.14 можно переписать с помощью переменных make так, как показано в примере 1.16.
Читать дальшеИнтервал:
Закладка: