2014-11-26 4 views
-1

У меня есть 3 файла, и я хочу сделать make-файл для них.Makefile отсутствует разделитель, но есть жесткая вкладка

Файлы:

  • polyHeader.c (Это файл, содержащий все функции определения)

  • polyHeader.h (Это заголовочный файл, содержащий все функции объявления/прототипы)

  • polyTest.c (Файл принадлежит главной)

Я создал следующий Makefile:

polyTest: polyTest.c polyHeader.o 
    gcc -Wall -o polyTest polyTest.c 

polyHeader.o: polyHeader.c 
    gcc -Wall -o polyHeader polyHeader.c 

ПРИМЕЧАНИЕ: Я не был уверен, если я должен также иметь дело с файлом заголовка (polyHeader.h) в Makefile или делает это даже необходимо скомпилировать (т.е. будет компоновщик просто найти и ссылку на него в любом случае - я включил его в обеих других файлах с помощью #include "polyHeader.h")

Во всяком случае, когда я запускаю команду грима для Makefile, показанного выше, я получаю следующее сообщение об ошибке:

Makefile:2: *** missing seperator. Stop. 

Может ли кто-нибудь посоветовать мне, как разобраться в этом?

+0

Вы будете иметь проблемы с компиляцией после работы make-файла; вам нужно включить 'polyHeader.o' в командной строке, которая создает' polyTest'. Тем не менее это не связано с вашей текущей проблемой. –

+0

Ok Jonathon, спасибо за это, из интереса: зачем мне включать .o (object file) в команду gcc? – SlamDunkMonk

+0

У вас есть пустая строка между строкой 'polyTest:' и 'gcc'? Работает ли он лучше, если вы его удалите? Есть ли пробел в начале этой строки? –

ответ

1
polyTest: polyTest.c polyHeader.o 

Эта строка указывает, что polyTest зависит от polyTest.c и polyHearder.o. Но в этой строке gcc я не вижу зависимости.

gcc -Wall -o polyTest polyTest.c 

И эта линия gcc должна начинаться с Tab, а не пространства.

0

Это Makefile, кажется, отсутствуют некоторые элементы, я предлагаю прочитать http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/ для деталей для простого содержания Makefile

Я предлагаю это быть написано примерно так:

// indicate certain targets will never be created 
.PHONY: all clean 

// get list of source files (wildcard would be an even better method) 
SRCS = polyHeader.c polyTest.c 

// convert list of source files to list of obj files 
OBJS = $(SRCS:.c=.o) 

CC=gcc 
CFLAGS= -Wall -c -I. 
DEPS = polyHeader.h 

// first/default target when not listed on command 
all: poly ${OBJS} 

// link objects to make 'poly' executable 
poly: ${OBJS} 
    $(CC) $(LFLAGS) -o poly $(OBJS) 

// compile each source file into a object file 
%.o: %.c $(DEPS) 
    $(CC) $(CFLAGS) -o [email protected] $< 

// target for removing debris from current directory 
clean: 
    rm -f *.o 
    rm -f poly 
+1

Необязательно помещать '-c' в переменную' CFLAGS', а не в рецепт, а 'LDFLAGS' более условна, чем' LFLAGS' –

+0

И вам нужно LDLIBS или около него после объектных файлов, если LDFLAGS (или LFLAGS) поступает перед объектными файлами. В противном случае ваш компоновщик сканирует библиотеки, затем объектные файлы и традиционно/обычно не работает. Кроме того, цель 'all' обычно не должна указывать' $ {OBJS} 'как зависимость - она ​​зависит от' poly' и 'poly' зависит от' $ {OBJS} 'явно. –

+0

Переопределение 'CC = gcc' бессмысленно, поскольку оно уже содержит правильное значение, а' CFLAGS' смешивает флаги компилятора и флаги препроцессора, которые должны находиться в переменной 'CPPFLAGS'. 'rm -f' следует заменить на' $ (RM) '** без ** определения этого. – Chnossos

Смежные вопросы