Утилита 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