В чем разница между make и gcc? - PullRequest
30 голосов
/ 20 апреля 2009

Последнее предложение в статье привлекло мое внимание

[F] или C / C ++ разработчики и студенты, заинтересованные в обучении программа на C / C ++, а не пользователи Linux. Это потому что компиляция исходного кода сделан простым в GNU / Linux с использованием 'make' команда.

Я всегда использовал gcc для компиляции моих программ на C / C ++, а javac для компиляции моих программ на Java. Я использовал make только для установки программ на мой компьютер с помощью configure / make / make install.

Похоже, что вы можете скомпилировать все ваши программы с помощью команды make.

В чем разница между make и gcc?

Ответы [ 11 ]

58 голосов
/ 20 апреля 2009

Ну ... gcc - это компилятор, make - это инструмент, помогающий создавать программы. Разница огромная. Вы никогда не сможете собрать программу, используя только make; это не компилятор. Что делает, он представляет отдельный файл «правил», который описывает, как перейти от исходного кода к готовой программе. Затем он интерпретирует этот файл, выясняет, что нужно скомпилировать, и вызывает для вас gcc. Это очень полезно для больших проектов с сотнями или тысячами файлов исходного кода, а также для отслеживания таких вещей, как параметры компилятора, пути включения и т.

13 голосов
/ 20 апреля 2009

gcc компилирует и / или связывает один файл. Он поддерживает несколько языков, но не знает, как объединить несколько исходных файлов в нетривиальную, запущенную программу - обычно вам понадобится как минимум два вызова gcc (compile и link) для создания даже самых простых программ.

Страница Википедии на GCC описывает ее как «систему компиляции»:

Коллекция компиляторов GNU (обычно сокращенно до GCC) - это система компиляторов, созданная проектом GNU, поддерживающая различные языки программирования.

make - это «инструмент сборки», который вызывает компилятор (который может быть gcc) в определенной последовательности, чтобы скомпилировать несколько источников и связать их вместе. Он также отслеживает зависимости между различными исходными файлами и объектными файлами, возникающие в результате компиляции источников, и выполняет только операции с компонентами, которые изменились с момента последней сборки.

GNUmake - одна из популярных реализаций make. Описание от GNUmake выглядит следующим образом:

Make - это инструмент, который управляет генерацией исполняемых файлов и других не исходных файлов программы из исходных файлов программы.

Make получает знания о том, как собрать вашу программу из файла, называемого make-файлом, в котором перечислены все файлы, не являющиеся исходными файлами, и как вычислить его из других файлов.

11 голосов
/ 20 апреля 2009

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/ имеет ее в различных формах.

5 голосов
/ 20 апреля 2009

Make часто использует gcc для компиляции множества файлов C или C ++.

4 голосов
/ 20 апреля 2009

make по сути является экспертной системой для построения кода. Вы устанавливаете правила для того, как вещи построены, и от чего они зависят. Затем Make может просмотреть временные метки всех ваших файлов и точно определить, что нужно перестроить в любое время.

gcc - это «коллекция компиляторов gnu». Есть много языков, которые он поддерживает (C, C ++, Ada и т. Д. В зависимости от вашей настройки), но все же это всего лишь один инструмент из многих, которые make может использовать для сборки вашей системы.

4 голосов
/ 20 апреля 2009

make использует Makefile в текущем каталоге, чтобы применить набор правил к своим входным аргументам. Make также знает некоторые правила по умолчанию, так что он выполняется, даже если он не находит файл Makefile (или аналогичный) в текущем каталоге. Правило выполнения для файлов cpp, поэтому во многих системах вызывается gcc.

Обратите внимание, что вы не вызываете make с входными именами файлов, а с именами правил , которые отражают выходных данных . Поэтому вызов make xyz будет стремиться выполнить правило xyz, которое по умолчанию создает файл xyz (например, на основе файла исходного кода xyz.cpp.

4 голосов
/ 20 апреля 2009

Make - это инструмент для построения любой сложной системы, в которой существуют зависимости между различными компонентами системы, путем выполнения минимального необходимого объема работы.

Если вы хотите узнать все, для чего может быть использована марка, то руководство по GNU make *1003* отлично.

3 голосов
/ 20 апреля 2009

gcc - это компилятор типа javac. Вы даете ему исходные файлы, он дает вам программу.

make - это инструмент для сборки. Он принимает файл, который описывает, как создавать файлы в вашем проекте на основе зависимостей между файлами, поэтому при изменении одного исходного файла вам не нужно перестраивать все (например, если вы использовали скрипт сборки). make обычно использует gcc для фактической компиляции исходных файлов.

3 голосов
/ 20 апреля 2009

Вы можете использовать make для компиляции ваших программ на C и C ++, вызывая gcc или g ++ в вашем make-файле, чтобы выполнить все шаги компиляции и компоновки, что позволит вам выполнить все эти шаги одной простой командой. Это не замена для компилятора.

2 голосов
/ 20 апреля 2009

'gcc' - это компилятор - программа, которая фактически превращает исходный код в исполняемый файл. Вы должны указать ему, где находится исходный код, что выводить, и различные другие вещи, такие как библиотеки и опции.

'make' больше похож на язык сценариев для компиляции программ. Это способ скрыть все детали компиляции вашего исходного кода (все эти аргументы, которые вы должны передать компилятору). Вы пишете все вышеперечисленные детали один раз в Makefile, поэтому вам не нужно вводить его каждый раз для каждого файла. Он также будет делать изящные вещи, такие как только перекомпиляция исходных файлов, которые были обновлены, и обрабатывать зависимости (если я перекомпилирую этот файл, мне потребуется перекомпилировать этот файл.)

...