2012-11-10 40 views
8

Tôi biết lỗi này đã bị đánh đến chết, nhưng tôi dường như không thể làm cho nó hoạt động được. Tôi đã liên kết makefile của tôi dưới đây:-lm Không liên kết thư viện toán học trong makefile

all: gensine info cs229towav 

encode.o: encode.h encode.c 
    gcc -c encode.c 

write.o: write.c write.h 
    gcc -c write.c 

gensine.o: encode.c gensine.h gensine.c helper.c write.c 
    gcc -c gensine.c -lm 

helper.o: helper.c helper.h 
    gcc -c helper.c 

read.o: read.h read.c 
    gcc -c read.c 

info.o:read.c info.h info.c decode.c 
    gcc -c info.c 

decode.o: decode.c decode.h helper.c 
    gcc -c decode.c 

cs229towav.o: write.c read.c cs229towav.c cs229towav.h helper.c decode.c encode.c 
    gcc -c cs229towav.c -lm 

gensine: encode.o gensine.o write.o helper.o 
    gcc -o gensine encode.o gensine.o write.o helper.o -lm 

info: read.o info.o decode.o helper.o 
    gcc read.o info.o decode.o helper.o 

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o 
    gcc -o write.o read.o cs229towav.o decode.o encode.o helper.o -lm 

Clean: 
    rm -rf *o gensine info cs229towav 

Khi tôi chạy một lệnh như "làm gensine" Tôi đang trở lại với những kết quả sau:

>cc gensine.c -o gensine 
/tmp/ccojm09X.o: In function `encodeCsFormat': 
gensine.c:(.text+0x4b1): undefined reference to `sin' 
/tmp/ccojm09X.o: In function `encodeWavFormat': 
gensine.c:(.text+0xa39): undefined reference to `sin' 
collect2: error: ld returned 1 exit status 

Sau khi đọc bài viết này là nói tài liệu tham khảo không xác định đối với tội lỗi, đó là với thư viện toán học. Các hàm được liệt kê nằm trong tệp "encode.c" được bao gồm trong tệp "gensine.c".

+3

Đoạn đầu ra đó dường như không tương ứng với tệp makefile ở trên, bạn có chắc là đang chọn đúng makefile không? – fvu

Trả lời

11

Các lệnh trong makefile:

gcc -o gensine encode.o gensine.o write.o helper.o -lm 

không phù hợp với lệnh bạn in ở cuối:

cc gensine.c -o gensine 

Cũng thông báo rằng không có -lm

Lưu ý rằng make biết cách tạo các tệp đối tượng để bạn không cần hầu hết các makefile. Hãy thử điều này (nhớ để thụt với TAB):

.PHONY : all clean 
all = gensine info 
CFLAGS =-Wall 
LIBS = -lm 

gensine: encode.o gensine.o write.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

info: read.o info.o decode.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

clean: 
     rm -rf *.o gensine info cs229towav 

Edit:

Boddie, lưu ý rằng sự nhầm lẫn của mình nảy sinh bởi vì bạn nghĩ rằng makefile là một kịch bản - tức là. bạn đang chạy tập lệnh có tên make khi bạn nhập make gensine. Trong thực tế, make là một lệnh như gcc ở một nơi khác trong hệ thống tệp (trên Linux, v.v., gõ which make để xem vị trí của nó). Lệnh make hy vọng sẽ tìm thấy tệp đầu vào chứa các quy tắc xây dựng được gọi là makefile hoặc Makefile trong thư mục hiện tại. Nếu nó không tìm thấy tập tin đó nó sử dụng một số quy tắc được xây dựng trong thay vì - do đó các cc gensine.c -o gensine đó là hư không trong makefile của bạn. Nếu bạn muốn, bạn có thể cho biết make tên của makefile (để nó không sử dụng tên mặc định) bằng công tắc -f, như @DanielFischer được mô tả trong các nhận xét.

+0

Tôi sử dụng tệp và tôi nhận được lỗi giống như trước đây. Nó cũng là kết quả tương tự từ trình biên dịch – boddie

+0

bạn gọi hàm makefile là gì? Bạn có nhiều hơn một makefile i thư mục? –

+0

tôi đặt tên là "make" không có phần mở rộng, và sau đó tôi gọi là "make gensine" – boddie

Các vấn đề liên quan