2012-03-06 29 views
8

Makefile sau đây không hoạt động và tôi không chắc chắn những gì đang xảy ra.Thiếu dấu tách trong Makefile?

CC = gcc 
CFLAGS = -Wall -g 

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

Bản trình diễn có chức năng chính và lib có tập hợp các phương pháp được sử dụng trong bản trình diễn.

Tôi đã thêm cờ -c vào lib. Tuy nhiên, khi tôi thực hiện, tôi nhận được:

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

Bạn có ý nghĩa gì khi "không hoạt động"? Bạn đang gặp phải lỗi gì? Điều gì đang xảy ra? _not_ đang diễn ra là gì? – Mat

+1

bạn có thể cho chúng tôi biết lỗi không? – MByD

+0

Rất tiếc, đã thêm ngay bây giờ. – Kobi

Trả lời

30

Với bản cập nhật của bạn với các lỗi, kiểm tra những gì bạn có trên dòng trước những ${CC} lệnh. Nhiều chương trình make yêu cầu một ký tự tab thực trước khi lệnh và trình chỉnh sửa đưa vào tám dấu cách (ví dụ) sẽ phá vỡ chúng. Đó là thường xuyên hơn không phải là nguyên nhân của các lỗi "Thiếu dấu phân tách".

Bạn có thể thấy điều đó với bảng điểm sau. Trong tập tin, có bốn không gian trước khi $(xyzzy):

xyzzy=echo 
all: 
    $(xyzzy) hello 

Vì vậy, khi tôi thực hiện nó, tôi nhận được lỗi tương tự như bạn:

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

Nhưng, khi tôi chỉnh sửa nó và biến những bốn không gian vào một tab, nó hoạt động tốt:

pax> make 
echo hello 
hello 

bạn cũng có một vấn đề với cách bạn đang cố gắng com bine các tập tin nguồn với nhau.

Nếu không có một lá cờ -c-gcc, nó sẽ cố gắng để tạo ra một thực thi riêng biệt từ mỗi của những lệnh, gần như chắc chắn dẫn đến mối liên kết lỗi. Bạn sẽ cần một cái gì đó tương tự (đơn giản):

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 

hoặc (hơi phức tạp hơn):

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 

Vấn đề với giải pháp đầu tiên là nó không cần thiết biên dịch cả hai chương trình ngay cả khi chỉ có một đã lỗi thời. Giải pháp thứ hai thông minh hơn một chút.

+0

Tôi đã thêm này cho '.editorconfig': [Makefile] indent_style = tab indent_size = 4 – DUzun

+1

@DUzun, giả định rằng 'Makefile' trong bình luận của bạn là tên tập tin, bạn có thể muốn xem xét cũng làm nó cho 'makefile' và' * .mk' (cùng với bất kỳ biến thể tệp nào khác mà bạn muốn sử dụng). – paxdiablo

1

lib cần được biên soạn làm thư viện chứ không phải là chương trình.

Hãy thử thay đổi nó để:

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

Cảm ơn, nhưng vấn đề vẫn còn đó. Tôi muốn liên kết lib với chính để nó biết nó có thể sử dụng các chức năng trong lib. – Kobi

0

Kể từ main phụ thuộc vào lib:

demo: lib demo.c 

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

Bạn có bỏ lỡ một số "tab" (\t) trước ${CC} bởi bất kỳ cơ hội?

Thường thì trình chỉnh sửa của tôi sẽ thay thế các tab theo không gian và tôi nhận được thông báo này.

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 
Các vấn đề liên quan