Утилита make

Для чего нужна раздельная компиляция? Во-первых, чисто «энергетически»: если какая-то часть программы не изменялась — ее незачем перекомпилировать. Если мы говорим о небольших программах, то затраченное на это время незначительно, однако если взять что-то большое, как ядро Linux, то вопрос стоит не о секундах и порой даже не о минутах. Во-вторых, логически разделив программу на несколько частей, с ней будет легче работать. В-третьих, при наличии разных файлов над программой смогут работать одновременно несколько человек.

В современных компьютерных процессорах, как правило, больше одного ядра, а технология Hyper-Threading/SMT увеличивает количество потоков вдвое. Утилита make поддерживает параллельную сборку; добавьте флаг -j и укажите количество потоков (оптимальное число равно количеству потоков в системе). Интегрированные среды разработки позволяют включать и отключать данную опцию через свой интерфейс.

Как определить, нужно ли снова компилировать тот или иной файл? В атрибутах файла имеется информация о его последней модификации. Если время создания объектного файла позднее последней модификации файла-исходника — значит, перекомпиляция не нужна, и наоборот, если файл модифицирован после компиляции — нужно заново произвести его компиляцию. Для автоматизации данного процесса используют утилиту make. Запускается она командой:

make

Однако не всё так просто! Вам необходимо описать правила, по которым утилита make будет обрабатывать те или иные файлы, и занести их в Makefile. Утилита make найдет его и произведет все необходимые операции. Формат файла примерно следующий:

[цель]:[зависимости]
|<-tab->|[команда]

Попробуйте выписать все зависимости для нашей предыдущей программы и составьте Makefile. Ниже приведен один из вариантов такого файла:

run : ./main
main : main.o ds18b20.o lcd.o
    gcc main.o ds18b20.o lcd.o -o main
​
main.o : main.c config/device.h ds18b20.c ds18b20.h lcd.c lcd.h
    gcc -std=c99 -Iconfig -c main.c
ds18b20.o : ds18b20.c ds18b20.h
    gcc -std=c99 -c ds18b20.c
lcd.o : lcd.c lcd.h
    gcc -std=c99 -c lcd.c

После запуска make в директории должен появиться файл main. На этом этапе можно перейти к какому-нибудь продвинутому текстовому редактору, например, к Sublime Text 3.

Запустите Sublime Text 3, откройте ваши файлы, выберите сборочную систему (меню Tools → Building System) Make. Теперь при нажатии комбинации ctrl + B Sublime будет запускать утилиту make в директории с main.c.

Утилита make — довольно гибкий инструмент. В Makefile могут содержаться макросы, что позволяет сократить количество текста. Если ко всем файлам применяются одни и те же флаги компилятора, логично их поместить в соответствующий макрос и не переписывать каждый раз. Изучите пример ниже.

CC = gcc
CFLAGS = -std=c99 -Wall
TARGET = main
# comment
$(TARGET): $(TARGET).c
$(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c

Изменено:

Язык и компилятор: 2 комментария

    • Согласен, наверное «с приставной» не правильно. Поправил на «с окнчанием».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.