gcc - это компилятор C: он берет исходный файл C и создает машинный код либо в виде несвязанных объектных файлов, либо в виде реальной исполняемой программы, которая была связана со всеми объектными модулями и библиотеками.
make полезен для управления процессом сборки проекта. Типичная программа на С состоит из нескольких модулей (.c) и заголовочных файлов (.h). Всегда будет компилироваться все после того, как вы что-либо измените, поэтому make предназначен для компиляции только тех частей, которые необходимо перекомпилировать после изменения.
Это делается по следующим правилам, созданным программистом. Например:
foo.o: foo.c foo.h
cc -c foo.c
Это правило указывает make, что файл foo.o зависит от файлов foo.c и foo.h, и, если любой из них изменится, его можно построить, выполнив команду во второй строке. (Выше приведен неверный синтаксис: make хочет, чтобы команды имели отступ с помощью символов табуляции, чего я не могу сделать в этом режиме редактирования. Однако представьте, что он здесь.)
make считывает свои правила из файла, который обычно называется Makefile. Поскольку эти файлы (традиционно) пишутся вручную, в make есть много волшебства, которое позволяет вам сократить правила. Например, он знает, что foo.o может быть собран из foo.c, и знает, что это за команда. Таким образом, вышеприведенное правило можно сократить до этого:
foo.o: foo.h
Небольшая программа, состоящая из трех модулей, может иметь такой Makefile:
mycmd: main.o foo.o bar.o
$(CC) $(LDFLAGS) -o mycmd main.o foo.o bar.o
foo.o: foo.h bar.h
bar.o: bar.h
make может делать больше, чем просто компилировать программы. Типичный Makefile будет иметь правило для удаления ненужных файлов:
clean:
rm -f *.o core myapp
Другое правило может запускать тесты:
check: myapp
./myapp < test.input > test.output
diff -u test.correct test.output
Makefile может «создавать» документацию: запустить инструмент для преобразования документации, например, с языка разметки в HTML и PDF.
Makefile может иметь правило установки для копирования бинарной программы, которую он собирает, куда бы пользователь или системный администратор не захотел ее установить.
И так далее. Поскольку make является универсальным и мощным средством, он обычно используется для автоматизации всего процесса от распаковки исходного архива до момента, когда программное обеспечение будет готово для использования пользователем.
Существует много, чтобы узнать о марке, если вы хотите изучить ее полностью. GNU-версия make имеет особенно хорошую документацию: http://www.gnu.org/software/make/manual/ имеет ее в различных формах.