2013-03-24 36 views
8



Tôi đang học lập trình C thông qua "Tìm hiểu cách thức cứng". Tôi hiện đang (trong một thời gian dài) trên Bài tập 2, có thể tìm thấy ở đây: http://c.learncodethehardway.org/book/ex2.htmlBiên dịch bất kỳ Chương trình C nào bằng cách sử dụng "make" (01 makefile)

Trong phần tín dụng bổ sung, có một thách thức yêu cầu chúng tôi chỉnh sửa Makefile để chúng tôi có thể biên dịch tệp .c (ex1.c) chỉ sử dụng lệnh "make". Đây là những gì thách thức chính xác nói:

Create an all: ex1 target that will build ex1 with just the command make.

Qua tìm here và một loạt các nơi khác, đây là đoạn code tôi nghĩ là đúng:

CFLAGS="-Wall" -g 

all: ex1 
    CFLAGS="-Wall" -g 

clean: 
    rm -f ex1 

Tuy nhiên, khi tôi cố gắng chạy này, Tôi nhận được tệp được biên dịch và tiếp tục gặp lỗi:

cc "-Wall" -g ex1.c -o ex1 
CFLAGS="-Wall" -g 
/bin/sh: 1: -g: not found 
make: *** [all] Error 127 

Điều gì đang xảy ra ở đây? Lý do đằng sau thông báo lỗi là gì? Làm thế nào tôi có thể sửa lỗi này?

Xin cảm ơn các bạn.

+0

Hmm, việc xóa dấu nháy kép dường như không làm gì cả. Bản thân chương trình đang biên dịch, nhưng tôi nhận được những thông báo lỗi lạ về "-g" không được tìm thấy. Tôi thực sự muốn biết những gì gây ra điều này và do đó làm thế nào tôi có thể sửa chữa nó – antigravityguy

Trả lời

10
  • Nếu all là mục tiêu đầu tiên trong makefile của bạn (Tôi đang thực hiện một đoán hoang dã ở đây vì bạn đã không cho thấy toàn bộ Makefile), chắc sẽ chọn đó là mục tiêu đầu tiên để xây dựng, khi bạn làm không vượt qua một mục tiêu rõ ràng từ dòng lệnh (tức là chỉ make)

  • ex1 là một điều kiện tiên quyết cho all, vì vậy nó được xây dựng đầu tiên nó và do đó bạn sẽ thấy dòng sau:

    cc "-Wall" -g ex1.c -o ex1 
    
  • Sau ex1 được xây dựng, hãy cố gắng để thực hiện các công thức cho tất cả, mà nó thực hiện lệnh sau:

    CFLAGS="-Wall" -g 
    
  • Kể từ -g bởi chính nó không phải là một lệnh hợp lệ hoặc ứng dụng có thể được thực hiện trong vỏ, bạn nhận được lỗi này:

    /bin/sh: 1: -g: not found 
    

giải pháp:

  • Bạn đã xác định CFLAGS khi bắt đầu makefile, do đó không cần phải xác định lại lần nữa trong công thức.Ngay cả khi bạn muốn ghi đè biến số CFLAGS, bạn không nên sử dụng nó trực tiếp như một phần của công thức.

  • Xác định allclean làm mục tiêu PHONY, nếu bạn chưa làm như vậy. Mục tiêu allclean không tạo tệp có tên all hoặc clean sau khi công thức được thực thi, do đó, thực tiễn tốt là phân loại các mục tiêu này là PHONY.

  • Bạn không cần dấu ngoặc kép quanh -Wall

Các Makefile sau có tất cả những điều chỉnh:

CFLAGS = -Wall -g 

all: ex1 

clean: 
    rm -f ex1 

.PHONY: all clean 
+0

Điều này hoạt động tốt. Cảm ơn – antigravityguy

4
CFLAGS = -Wall -g 

all: ex1 

clean: 
    rm -f ex1 

Nên là tất cả những gì bạn cần kể từ khi tạo quy tắc mặc định được xây dựng để biên dịch tệp .c thành tệp thực thi.

Sai lầm của bạn là sử dụng một phép gán biến làm lệnh. Phần với

CFLAGS="-Wall" -g 

cố gắng chạy lệnh -g với một nhiệm vụ biến one-shot CFLAGS="-Wall".

+0

Hi, cảm ơn cho phản ứng của bạn. Điều này có ý nghĩa bây giờ. – antigravityguy

0

Tôi muốn đề nghị một điều chỉnh để bạn có thể xây dựng ex1 chỉ bằng cách nhập make, bất kể đây có phải là lần biên dịch đầu tiên hay là recompilaiton của mã nguồn hay không.

Nguồn:ex1.c

Makefile:

CFLAGS=-Wall -g 

all : clean ex1 

clean: 
    rm -rf ex1 ex1.dSYM 

.PHONY: all clean 

Bằng cách thêm clean Target giả mạo như là người đầu tiên điều kiện tiên quyết cho all, nó sẽ thực hiện lệnh rm -rf ex1 ex1.dSYM trước khi thực hiện các ngụ ý cc lệnh với điều kiện tiên quyết ex1.

Ngoài ra, trên Mac OS-X sử dụng .PHONY all clean là không cần thiết cho make để thực hiện các lệnh trong Makefile, tuy nhiên, nó là tiền lệ có lẽ là tốt để thiết lập để cho bất cứ ai đọc mã sau này nhận ra rằng tất cả và sạch sẽ không các tệp đích thực tế.

Oh và cảm ơn Zed A. Shaw vì đã thực hiện Tìm hiểu cách thức khó khăn miễn phí để đọc tại trang web của mình Learn C the Hard Way.