2012-03-18 3 views
3

У меня возникли проблемы с основами makefile.Основы makefile

Я использую GCC для компиляции

Что мне нужно сделать, это сделать Makefile именем labMakefile и целями являются

lab 
labM.o 
labG.o 
clean 

файлы уже в папке, в которой я сейчас работаю состоит из

labM.c 
labM.o 
labG.c 
labG.o 

Я смотрел на Makefile учебники, но я не могу показаться, чтобы найти правильный способ создания Makefile

Что я попробовал

labMakefile: labM.o labG.o 

, но он просто говорит labMakefile:: command not found

+0

Я сомневаюсь, что это сообщение об ошибке, потому что это другая заглавная буква. Если, конечно, нет ... –

+0

Я думаю, что 'make -f labMakeFile lab' – JA3N

+0

Ну, ваш make-файл называется' labMakefile' (по-видимому), а не 'labMakeFile', поэтому есть одна проблема. Вторая проблема заключается в том, что вы просите его создать целевую «лабораторию», но ваш make-файл не имеет никакой цели, называемой 'lab'. –

ответ

6

Файл makefile - это скрипт, которым управляет Make. Это всего лишь текстовый файл, написанный со строгой грамматикой, которая делает потребности, такие как исходный код (хотя он интерпретируется, а не компилируется). Вы можете использовать любой текстовый редактор, который вам нравится создавать.

Вы используете C (судя по суффиксам на ваших именах файлов). Таким образом, чтобы создать labM.o из labM.c вы, вероятно, использовать команду как

gcc -c labM.c -o labM.o 

(Не то, -o labM.o действительно необходимо, это поведение по умолчанию, я просто пытаюсь по буквам вещи немного.) Точно так же к строить labG.o вы будете использовать

gcc -c labG.c -o labG.o 

, а затем (я думаю) вы бы связать их вместе, чтобы построить лабораторию:

gcc labM.o labG.o -o lab 

А иногда вы хотите, чтобы очистить построенные файлы:

rm -f *.o lab 

Так, чтобы сделать все это, вы бы написали Makefile называется Makefile, который выглядел так (обратите внимание, что ведущие пространства ТКС):

labM.o: 
    gcc -c labM.c -o labM.o 

labG.o: 
    gcc -c labG.c -o labG.o 

lab: 
    gcc labM.o labG.o -o lab 

.PHONY:clean 
clean: 
    rm -f *.o lab 

Тогда вы могли бы make lab или make clean или make labM.o labG.o. Если вы действительно хотите назвать этот makefile labMakefile, вы можете сделать это, но тогда вам придется сделать это, например. make -f labMakefile lab. Этот make-файл является сырым, но эффективным. Это может быть значительно улучшена:

CC = gcc 

lab: labM.o labG.o 
    gcc $^ -o [email protected] 

lab%.o: lab%.c 
    $(CC) -c $< -o [email protected] 

.PHONY:clean 
clean: 
    @echo cleaning things up, boss... 
    @rm -f *.o lab 

Это будет обрабатывать зависимости лучше: если вы измените labM.c но не labG.c, а затем make, сделать будет знать, что labM.olab) должен быть восстановлен, но labG.o не нужно быть.

Это много, чтобы принять участие, и возможно дальнейшее улучшение (обработка зависимостей может быть сделана очень slick), но это хорошее начало.

+0

У меня уже есть labM.o, зачем мне его создавать из labM.c? И 'labM.o: НКУ -c -o labM.c labM.o labG.o: НКУ -c -o labG.c labG.o лаборатории: НКУ labM.o labG.o -o лаборатория .PHONY: clean clean: rm -f * .o lab' это внутри labMakefile? – JA3N

+0

@ JA3N, если вы хотите сделать 'lab' * только один раз *, вам не нужен make-файл, просто что-то вроде' gcc labM.o labG.o -o lab'. Файл make автоматически автоматизирует процесс, поэтому вы можете изменить источник, а затем просто «make». И да, все это в labMakefile. – Beta

+0

Правило шаблона для построения объектов является встроенным, его не нужно включать. – blueshift

2

Чтобы запустить Makefile, вы должны вызвать «сделать»

Если Makefile не имеет стандартное имя (Makefile или Makefile) , вы должны указать его с аргументом -f:

make -f labMakefile 
+0

Если я нахожу, что в нем сказано 'make: labMakefile: Нет такого файла или каталога' ' make: *** Нет правила для создания целевого labMakefile. Стоп. ' – JA3N

+0

Кто, ты не сказал мне достаточно! Каково имя вашего файла makefile? В каком каталоге. Не забудьте записать cd в правильный каталог, а затем вызвать make с помощью «make -f replaceThisStringWithTheNameOfYourMakefile» – laerne

+0

Имя моего makefile _should_ be labMakefile, я думаю, что я еще не сделал этого. Это одна из проблем, с которыми я сталкиваюсь , Извините, если я не упомянул об этом – JA3N