2012-03-06 18 views
8

Poniższy plik Makefile nie działa i nie jestem pewien, co się dzieje.Brakujący separator w Makefile?

Demo ma główną funkcję, a lib ma zestaw metod używanych w wersji demonstracyjnej.

Dodałem opcję -c do biblioteki. Jednak gdy uruchamiam zrobić, otrzymuję:

Makefile:5: *** missing separator. Stop. 
+1

Co masz na myśli mówiąc "nie działa"? Jakie błędy dostałeś? Co się dzieje? Co się _nie dzieje? – Mat

+1

Czy możesz pokazać nam błąd? – MByD

+0

Przepraszamy, dodaliśmy go teraz. – Kobi

Odpowiedz

30

wyraziłeś aktualizacja z błędu, sprawdź co masz na linii przed tymi ${CC} poleceń. Wiele programów make wymaga znaku tabulacji real zanim komendy i edytory, które wprowadzają osiem spacji (na przykład), będą je łamać. To częściej niż nie jest przyczyną błędów "Brakujący separator".

Widać to z następującym transkrypcją. W pliku znajdują się cztery pomieszczenia przed $(xyzzy):

xyzzy=echo 
all: 
    $(xyzzy) hello 

Więc, kiedy mi się uda, mam ten sam błąd jak ty:

pax> make 
makefile:3: *** missing separator. Stop. 

Ale kiedy go edytować i obrócić te cztery przestrzenie w karcie, to działa dobrze:

pax> make 
echo hello 
hello 

mieć również problem z drogi, którą próbujesz com pogrupuj pliki źródłowe razem.

Bez -c flagi do gcc, będzie starał się stworzyć osobny plik wykonywalny z każdy z tych komend, prawie na pewno prowadzi do błędów łącznikowych. Będziesz potrzebować czegoś podobnego (prosty):

CC = gcc 
CFLAGS = -Wall -g 

# Just compile/link all files in one hit. 
demo: demo.c lib.c 
    ${CC} ${CFLAGS} -o demo demo.c lib.c 

clean: 
    rm -f demo 

lub (nieco bardziej skomplikowane):

CC = gcc 
CFLAGS1 = -Wall -g -c 
CFLAGS2 = -g 

# Link the two object files together. 

demo: demo.o lib.o 
    ${CC} ${CFLAGS2} -o demo demo.o lib.o 

# Compile each source file to an object. 

demo.o: demo.c 
    ${CC} ${CFLAGS1} -o demo.o demo.c 

lib.o: lib.c 
    ${CC} ${CFLAGS1} -o lib.o lib.c 

clean: 
    rm -f demo 

Problem z pierwszego rozwiązania jest to, że niepotrzebnie kompiluje obu programów, nawet jeśli tylko jeden jest nieaktualne. Drugie rozwiązanie jest trochę bardziej inteligentne.

+0

Dodałem to do '.editorconfig': [Makefile] indent_style = zakładka indent_size = 4 – DUzun

+1

@DUzun, zakładając, że' Makefile' w swoim komentarzu jest nazwa pliku, może warto rozważyć ten również to także dla 'makefile' i' * .mk' (wraz z innymi wariantami tworzenia plików, których chcesz użyć). – paxdiablo

1

lib musi być skompilowany jako biblioteka, a nie programu.

Spróbuj zmienić go na adres:

main: 
    ${CC} ${CFLAGS} main.c lib.o -o main 
lib: 
    ${CC} ${CFLAGS} lib.c -c -o lib.o 
+0

Dzięki, ale problem nadal istnieje. Chcę połączyć lib z głównym, więc wie, że może korzystać z funkcji w lib. – Kobi

0

Od main zależy lib:

demo: lib demo.c 

i

${CC} ${CFLAGS} lib.c -c -o lib.o 
5

Czy tęsknisz trochę "zakładkę" (\t) przed ${CC} przypadkiem?

Często mój edytor zastępuje tabulatory spacjami i otrzymam tę wiadomość.

CC = gcc 
CFLAGS = -Wall -g 

demo: 
[TAB]${CC} ${CFLAGS} demo.c -o demo 
lib: 
[TAB]${CC} ${CFLAGS} lib.c -o lib 
clean: 
[TAB]rm -f lib demo