Программирование для Linux. Профессиональный подход - [6]

Шрифт
Интервал

. Он предназначен для удаления всех сгенерированных объектных файлов и программ, чтобы можно было начать все сначала. Правило для данного модуля включает команду >rm, удаляющую перечисленные файлы.

Чтобы передать всю эту информацию утилите >make, необходимо создать файл >Makefile. Его содержимое будет таким:

>reciprocal: main.o reciprocal.o

>       g++ $(CFLAGS) -о reciprocal main.o reciprocal.o


>main.o: main.c reciprocal.hpp

>        gcc $(CFLAGS) -c main.c


>reciprocal.o: reciprocal.cpp reciprocal.hpp

>        g++ $(CFLAGS) -c reciprocal.cpp


>clean:

>        rm -f *.o reciprocal

Целевые модули перечислены слева. За именем модуля следует двоеточие и существующие зависимости. В следующей строке указано правило, по которому создается модуль (назначение записи >$(CFLAGS) мы пока проигнорируем). Строка правила должна начинаться с символа табуляции, иначе утилита >make проинтерпретирует ее неправильно.

Если удалить созданные нами выше объектные файлы и ввести

>% make

будет получен следующий результат:

>% make

>gcc -c main.c

>g++ -c reciprocal.cpp

>g++ -o reciprocal main.o reciprocal.o

Утилита >make автоматически создала объектные файлы и скомпоновала их. Попробуйте теперь внести какое-нибудь простейшее изменение в файл >main.c и снова запустить утилиту. Вот что произойдет:

>% make

>gcc -с main.c

>g++ -о reciprocal main.o reciprocal.o

Как видите, утилита >make повторно создала файл >main.o и перекомпоновала программу, но не стала перекомпилировать файл >reciprocal.cpp, так как в этом не было необходимости.

Запись >$(CFLAGS) обозначает переменную утилиты make. Ее можно определить либо в файле >Makefile, либо в командной строке. Утилита подставит на место переменной реальное значение во время выполнения правила. Вот как, например, можно осуществить перекомпиляцию с включённой оптимизацией:

>% make clean

>rm -f *.o reciprocal

>% make CFLAGS=-O2

>gcc -O2 -c main.c

>g++ -O2 -c reciprocal.cpp

>g++ -O2 -o reciprocal main.o reciprocal.o

Обратите внимание на то, что вместо записи >$(CFLAGS) в правилах появился флаг >-O2.

В этом разделе мы рассмотрели лишь самые основные возможности утилиты >make. Чтобы получить о ней более подробную информацию, обратитесь к интерактивной документации, введя такую команду:

>% info make

В документации можно найти полезные сведения о том, как упростить управление файлом >Makefile, уменьшить число необходимых правил и автоматически вычислять зависимости.

1.4. GNU-отладчик gdb

Отладчик — это программа, с помощью которой можно узнать, почему написанная вами программа ведет себя не так, как было задумано. Работать с отладчиком приходится очень часто. Большинство Linux-программистов имеет дело с GNU-отладчиком (GNU Debugger, GDB), который позволяет пошагово выполнять программу, создавать точки останова и проверять значения локальных переменных.

1.4.1. Компиляция с включением отладочной информации

Чтобы можно было воспользоваться GNU-отладчиком, необходимо скомпилировать программу с включением в нее отладочной информации. Этой цели служит опция >-g компилятора. Если имеется описанный выше файл Makefile, достаточно задать переменную >CFLAGS равной >-g при запуске утилиты >make:

>% make CFLAGS=-g

>gcc -g -с main.c

>g++ -g -c reciprocal.cpp

>g++ -g -о reciprocal main.o reciprocal.o

Встречая в командной строке флаг >-g, компилятор включает дополнительную информацию в объектные и исполняемые файлы. Благодаря этой информации отладчик узнает, какие адреса соответствуют тем или иным строкам в том или ином исходном файле, как отобразить значение локальной переменной, и т.д.

1.4.2. Запуск отладчика

Отладчик >gdb запускается следующим образом:

>% gdb reciprocal

После запуска появится строка приглашения такого вида:

>(gdb)

В первую очередь необходимо запустить программу под отладчиком. Для этого введите команду >run и требуемые аргументы. Попробуем вызвать программу без аргументов:

>(gdb) run

>Starting program: reciprocal


>Program received signal SIGSEGV, Segmentation fault.

>__strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)

>at strtol.c:287

>287  strtol.c: No such file or directory.

>(gdb)

Проблема заключается в том, что в функции >main() не предусмотрены средства контроля ошибок. Программа ожидает наличия аргумента, а в данном случае его нет. Получение сигнала >SIGSEGV означает крах программы. Отладчик определяет, что причина краха находится в функции >__strtol_internal(). Эта функция является частью стандартной библиотеки, но ее исходный файл отсутствует. Вот почему появляется сообщение "No such file or directory". С помощью команды >where можно просмотреть содержимое стека:

>(gdb) where

>#0 __strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)

>   at strtol.c:287

>#1 0x40096fb6 in atoi (nptr=0x0) at ../stdlib/stdlib.h:251

>#2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8

Как нетрудно заметить, функция >main() вызвала функцию >atoi(), передав ей нулевой указатель, что и стало причиной ошибки.

С помощью команды >up можно подняться но стеку на два уровня, дойдя до функции >main():

>(gdb) up 2

>#2 0x804863е in main (argc=1, argv=0xbffff5e4) at main.c:8

>8    i = atoi(argv[1]);

Заметьте, что отладчик нашел исходный файл >main.c


Рекомендуем почитать
Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.


Пишем драйвер Windows на ассемблере

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Информационная технология. Руководство по управлению документированием программного обеспечения

ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИИнформационная технологияРУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯInformation technology. Guidelines for the management of software documentationИздание официальноеДата введения 1994-07-01ГОССТАНДАРТ РОССИИ Москва© Издательство стандартов, 1994.


Самоучитель UML

Самоучитель UMLПервое издание.В книге рассматриваются основы UML – унифицированного языка моделирования для описания, визуализации и документирования объектно-ориентированных систем и бизнес-процессов в ходе разработки программных приложений. Подробно описываются базовые понятия UML, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.