2013-03-24 49 views
7



Tôi đang học lập trình C thông qua "Tìm hiểu cách thức cứng". Hiện tại tôi đang thực hiện Bài tập 1, có thể tìm thấy tại đây: http://c.learncodethehardway.org/book/ex1.htmlSử dụng lập trình "lập trình C" (Tìm hiểu theo cách thức C)

Tôi hiểu khái niệm được đề cập, nhưng không hiểu quy trình biên dịch. Trong khi sử dụng "làm cho" lệnh trong dòng lệnh, tại sao công việc này:

$ make ex1 

Và điều này không làm việc:

$ make ex1.c 

Tôi đã thực sự đơn giản chạy lệnh thứ hai cho đến khi một phút trước. Cuối cùng tôi đã tìm ra nó. Cho đến khi tôi làm vậy, tôi vẫn nhận được thông báo lỗi này:

make: nothing to be done for 'ex1.c' 

Mặc dù đây chỉ là một kỹ thuật, tôi vẫn muốn biết điều gì đang xảy ra. Cảm ơn :)

+0

không phải là gcc ex1.c -o ex1? Bởi vì gcc là trình biên dịch C. – Survivor

+0

Câu hỏi này là nhiều hơn về chương trình 'make' so với ngôn ngữ C. – aschepler

+0

Xin lỗi, hãy ghi nhớ điều này trong tất cả các câu hỏi trong tương lai. Đây thực sự là bài đăng đầu tiên của tôi trên stackoverflow và các câu trả lời nhanh chóng đáng ngạc nhiên! Cảm ơn tất cả các bạn một lần nữa. – antigravityguy

Trả lời

12

Cả hai công việc; họ chỉ làm nhiệm vụ khác nhau.

  • make ex1.c nói "bằng cách sử dụng quy tắc trong makefile cộng được xây dựng trong kiến ​​thức, đảm bảo rằng các tập tin ex1.c được cập nhật".

    Chương trình make tìm thấy ex1.c và không có quy tắc để xây dựng từ một thứ khác (không có mã nguồn RCS hoặc SCCS chẳng hạn), vì vậy báo cáo 'Không cần làm gì'.

  • make ex1 nói "sử dụng quy tắc trong makefile cộng với kiến ​​thức được tích hợp sẵn, đảm bảo rằng tệp ex1 được cập nhật".

    Chương trình make thấy rằng nó biết một cách để tạo ra một thực thi ex1 từ tập tin nguồn ex1.c, vì vậy nó đảm bảo rằng các nguồn tập tin ex1.c được cập nhật (nó tồn tại, vì vậy nó được cập nhật), và sau đó đảm bảo rằng ex1 cũng được cập nhật (có nghĩa là 'tệp ex1 đã được sửa đổi gần đây hơn ex1.c). Nếu bạn đã chỉnh sửa ex1.c kể từ lần cuối cùng bạn chạy make, nó sẽ thực hiện quá trình biên dịch để làm cho ex1 mới hơn ex1.c. Nếu quá trình biên dịch thất bại, tệp ex1 sẽ không tồn tại, do đó bạn sẽ nhận được một lần biên dịch lại vào lần sau. Và một khi nó được cập nhật, sau đó make sẽ không xây dựng lại ex1 một lần nữa cho đến khi bạn sửa đổi lại nguồn.

Đây là cách make được thiết kế để hoạt động.

+0

Cảm ơn phản hồi thực sự chi tiết. Điều đó có ý nghĩa, mặc dù đến từ môi trường python, điều này dường như thực sự cứng nhắc – antigravityguy

+4

Tôi chưa bao giờ thấy trang web đó trước đây, nhưng tiêu đề của Ex 2, "Make Is Python Now", rất gây hiểu nhầm. Tôi nhận được những gì họ đang cố gắng để nói, nhưng Make không phải là Python. So sánh Make và Python giống như so sánh con dao khắc với nhà bếp. Make được thiết kế đặc biệt để cập nhật các tập tin lỗi thời. Nó rất tốt ở đó. Python được thiết kế để trở thành một ngôn ngữ có mục đích chung. Nó rất tốt ở đó. Tôi khuyên bạn nên bỏ qua sự so sánh này: nó có vẻ khó hiểu hơn là chiếu sáng cho tôi. – MadScientist

4

Mục tiêu để make thường chỉ định những gì bạn muốn nó xây dựng hoặc xây dựng lại, không phải những gì bạn muốn nó sử dụng để xây dựng cái gì khác.

Nếu bạn nhập ex1.c (và không có quy tắc để tự động tạo), chỉ cần trả lời "Yup, tệp đó tồn tại".

1

đối số cho công cụ make là tên của tệp thực thi mà nó sẽ giúp tạo cho bạn. Không nên có tiện ích mở rộng .c.Bạn chỉ nên có viết make ex1.

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