методичка-1
.pdfлы clean, install и uninstall, позволяющие очищать информацию, не-
нужную после создания программы, устанавливать программу в сис-
тему и отменять установку программы соответственно. Приведем пример Makefile для Linux:
HelloWorld: foo.o main.o
g++ foo.o main.o -o HelloWorld foo.o: foo.cpp foo.h
g++ -c foo.cpp main.o: main.cpp foo.h
g++ -c main.cpp clean:
rm -f HelloWorld foo.o main.o install:
cp HelloWorld /usr/local/bin/HW uninstall:
rm -f /usr/local/bin/HW
Имеющийся Makefile позволяет выполнять следующие коман-
ды:
собрать из исходных файлов программу;
make
удалить информацию ненужную после сборки программы. В
правиле clean стоит команда rm, удаляющая исполняемый и объект-
ные файлы. Флаг -f означает, что, если удаляемый файл отсутствует,
программа не должна выдавать сообщений. Правило clean приводит проект к состоянию, в каком он был до команды make. Очистка вы-
полняется после установки программы в систему;
make clean
установить программу в систему. Правило install помещает исполняемый файл в каталог /usr/local/bin – стандартный каталог раз-
13
мещения пользовательских программ. После этого её можно вызы-
вать набором имени (HelloWorld);
make install
отменить установку программы.
make uninstall
Следует учесть что выполнение установки и обратной её опера-
ции в Linux требует привилегий администратора, т.е. выполнения следующих команд:
su root
make install
exit
14
4. Отладчик gdb
Программа отладчик используется для исправления ошибок пропущенных программистом и компилятором или исправление ко-
торых невозможно в момент написания кода программы и компиля-
ции. Входящий в комплект программ GNU отладчик называется
GDB. Версия для ОС Windows поставляется отдельно от набора
MinGW и требует дополнительной установки.
Для того, чтобы пользоваться отладчиком, нужно сначала ском-
пилировать программу так, чтобы её двоичный файл содержал отла-
дочную информацию. Эта информация включает в себя, в частности,
описание соответствий между адресами исполняемого кода и строка-
ми в исходном коде.
Такая компиляция достигается путём добавления флага -g, на-
пример:
g++ main.cpp foo.cpp -o HelloWorld -g
Если используется команда make, то необходимо поставить оп-
цию CFLAGS=-g. В этом случае все команды на компиляцию, содер-
жащиеся в Make-файле, автоматически получат флаг -g.
make CFLAGS=-g
Другой способ добавить отладочную информацию исправить
Makefile добавив ко всем строкам отвечающим за компиляцию опцию
-g.
При запуске отладчика указывается файл для отладки.
gdb ./HelloWorld
Приведем пояснения к основным командам управления отлад-
чиком. Запуск программы внутри отладчика, производится после за-
пуска отладчика командой run.
run
После этой команды начинается выполнение программы до пер-
15
вой точки остановки. Точка остановки это метка, указывающая файл с исходным кодом и номер строки, на которой отладчик остановит выполнение программы. Для просмотра исходного кода девяти пер-
вых строк главного файла программы используется команда list.
list
Для указания конкретных строк, например с третьей строки по шестую файла main.cpp используется команда
list 4,6
или
list main.cpp:4,6
Таким же образом можно посмотреть содержимое других ис-
ходных файлов, например:
list foo.h:1,6
Для установки точки останова (breakpoint) используется команда break. Например, установка точки останова в файле main.cpp в седь-
мой строке производится командами:
list main.cpp:1,9
break 7
Выполнение первой команды делает активным файл main.cpp и
позволяет просмотреть строки в которых будет установлена точка ос-
танова. Вторая команда непосредственно создает точку останова.
Кроме того, для указания точки останова можно использовать назва-
ние функции, перед входом в которую требуется установить точку останова.
Осуществить просмотр установленных точек останова произво-
дится командой info breakpoints.
info breakpoints
После запуска программы и остановки на точки останова, можно узнать где именно произошла остановка, для этого используется ко-
манда backtrace.
16
backtrace
Отладчик выдаст информацию о функции, в которой произошла остановка, имени файла и номере строки с исходным кодом. Функция backtrace показывает весь стек функций, поэтому будут отражаться все названия функций от текущего места вплоть до main.
Для просмотра значения любой переменной используется ко-
манда print.
print message
Для отображения значения конкретной переменной на каждой точке остановки, используется команда display.
display message
Продолжение выполнения программы после останова произво-
дится командой continue.
continue
Выполнение команды run после точки останова, приведет к пе-
резапуску выполнения программы.
Для изменения значения во время выполнения используется ко-
манда set.
set message=0x000000
Осторожно! message это указатель на класс, его обнуление при-
водит к неверному выполнению программы, а в некоторых случаях к краху программы или системы. Данная команда, примененная к ука-
зателю приведена исключительно для первокурсников с целью нау-
чить их экспериментировать и не боятся нарушать правила в преде-
лах разумного.
Удаление точек останова производится командой delete с поряд-
ковым номером точки останова.
delete 1
Команда удаляет первую точку останова.
Для пошагового выполнения программы используется команда
17
step. Её также можно вызывать одной буквой s. Для её использования необходимо установить точку останова и запустить программу ко-
мандой run, после остановки выполнения на точки останова вводится команда step.
step
или
s
Если требуется пошаговое выполнение программы в пределах одной функции, используется команда next.
next
или
n
Если после входа в функцию необходимо прекратить пошаговое выполнение в её пределах, используется команда finish.
finish
Таким образом можно покинуть продолжительную функцию,
если отладка не затрагивает её содержимое.
Список наиболее часто встречающихся команд отладчика при-
веден в приложении 2.
18
5. Средства обеспечения переносимости и распространения
Makefile
На сегодняшний момент существует множество UNIX-
подобных ОС и линейка ОС Windows. Для переносимости программ между ними возникает необходимость корректировать Makefile. При-
веденный в предыдущем разделе Makefile для Linux не может быть корректно выполнен в Windows. Решение этой проблемы возможно с помощью скрипта или утилиты configure, входящей в состав инстру-
ментов, называемых GNU Autotools. Аналог такой возможности в средах быстрой разработки автору не известен.
Вкачестве утилиты configure чаще используется в ОС Windows,
вОС Linux configure реализуется как скрипт. В этом случае пользова-
телю поставляются исходные файлы программы на языке програм-
мирования и скрипт configure, выполнение которого приводит к соз-
данию Makefile. Следует учесть что при работе в Windows, набор ин-
струментов Autotools устанавливается отдельно от набора MinGW.
Последовательность действий пользователя заключается в выполне-
нии команды:
./configure
Далее, выполняется работа с обычным Makefile.
make
make install
make clean
Для получения конфигурационного скрипта удалите из папки все файлы, кроме файлов с исходным текстом. Создайте два тексто-
вых файла Makefile.am и configure.ac. Содержимое файла
Makefile.am:
bin_PROGRAMS=HelloWorld.exe
HelloWorld_SOURCES=foo.h foo.cpp main.cpp
19
Значения записей:
bin_PROGRAMS=HelloWorld.exe - название конечного испол-
няемого файла.
HelloWorld_SOURCES=foo.h foo.cpp main.cpp - указывает на все исходные файлы, участвующие в сборке программы.
Содержимое файла configure.ac:
AC_INIT(main.cpp)
AM_INIT_AUTOMAKE(HelloWorld,0.1)
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_OUTPUT(Makefile)
Скрипт configure.ac всегда начинается директивой AC_INIT и
заканчиваться AC_OUTPUT. Значение команд.
AC_INIT(main.cpp) - инициализация скрипта. В качестве пара-
метра передаётся название любого из исходных файлов. Проверяет,
находится ли в данном каталоге такой файл и, если находится, счита-
ет текущий каталог рабочим. AM_INIT_AUTOMAKE(HelloWorld,0.1) - указывает, что будет
использоваться утилита automake. Параметры указывают на название и версию, которые программа должна получить после сборки.
AC_PROG_CC и AC_PROG_CXX - указывают, каким синтакси-
сом и с применением каких библиотек написана программа. Необхо-
димы для выбора соответствующего компилятора. Если программа написана на C++ и использует стандартную библиотеку C++, выбира-
ется директива AC_PROG_CXX. Если на С, выбирается
AC_PROG_CC. В крупных программах, где используются элементы двух языков, пишутся обе директивы.
20
AC_PROG_INSTALL - указывает, что в make-файле необходимо сформировать цель install, чтобы пользователь мог командой make install установить программу в системный каталог.
AC_OUTPUT - завершает скрипт и указывает, что конечный файл должен называться Makefile.
Дальше все операции будут рассматриваться применительно к ОС Linux, однако они имеют минимальные отличия от действий вы-
полняемых для ОС Windows.
Для создания программы необходимо выполнить, находясь в папке с исходными файлами следующие команды:
aclocal
autoconf
touch README AUTHORS NEWS ChangeLog
automake -a
./configure
make
Разберём введеные команды:
aclocal сканирует файл configure.ac и, в зависимости от его ди-
ректив, формирует макросы, предназначенные для autoconf и automake; эти макросы сохраняются в файле aclocal.m4;
autoconf формирует скрипт configure в зависимости от содержи-
мого configure.ac;
automake формирует скрипт Makefile.in в зависимости от содер-
жимого Makefile.am; в дальнейшем пользователь, запустив configure,
сформирует Makefile на основании Makefile.in. Флаг -a означает, что,
если программа не найдёт в каталоге проекта файлов install-sh, missing, INSTALL, COPYING, depcomp, она автоматически создаёт их. Наличие этих файлов обязательно в соответствии с их стандартым набором в GNU программе. В случае их отсутствия automake не смо-
жет выполниться. Для их создания используется команда touch
21
NEWS README AUTHORS ChangeLog, которая меняет время моди-
фикации файлов на текущее, а в случае отсутствия файла, создвет его пустым.
Распространение исполняемых файлов происходит в виде дист-
рибутивов, создать который можно следующей командой:
make dist
Обратите внимание, Makefile созданный автоматически содер-
жит разделы, которые ранее не упоминались, например, dist. Благода-
ря этому разделу и появляется возможность создать дистрибутив. В
результате должен появиться файл HelloWorld-0.1.tar.gz.
После этой операции программа полностью готова к распро-
странению.
Для установки полученного дистрибутива необходимо выпол-
нить следующие действия:
разархивировать дистрибутив gunzip kalkul-0.1.tar.gz tar xf kalkul-0.1.tar
перейти в каталог с дистрибутивом cd HelloWorld-0.1
сформировать makefile
./configure
собрать программу make
установить её в системный каталог su root
make install exit
очистить разархивированный каталог от ненужных файлов make clean
Чтобы удалить программу выполните команды:
22