Программирование для 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
![Графика для Windows средствами DirectDraw](/storage/book-covers/6d/6dbc78361f37e9af5b71d5019ca64570a40e0466.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Виртуальная библиотека Delphi](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Пишем драйвер Windows на ассемблере](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Как писать драйвера](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![MFC и OpenGL](/build/oblozhka.dc6e36b8.jpg)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
![Информационная технология. Оценка программной продукции характеристики качества и руководства по их применению](/build/oblozhka.dc6e36b8.jpg)
Стандарт подготовлен на основе применения аутентичного текста международного стандарта ИСО/МЭК 9126-91 «Информационная технология. Оценка программной продукции. Характеристики качества и руководства по их применению»Information technology. Software product evaluation. Quality characteristics and guidelines for their use.