2011-07-10 27 views
6

Đôi khi nó có vẻ như không phải là một thực thi mới được xây dựng, mặc dù tôi cần một, nhưng tôi không hiểu tại sao. Ví dụ, khi tôi thay đổi một Makefile, nhưng đã có một file thực thi, và khi tôi thực thi 'make' nó không tạo ra một file thực thi được cập nhật.Tại sao/khi nào tôi cần mục tiêu 'sạch'?

Không phải là toàn bộ mục đích của Makefiles để tôi không cần phải lo lắng về những thứ đó nữa?

Trả lời

6

Từ GNU make documentation

Các biên dịch lại phải được thực hiện nếu các tập tin nguồn, hoặc bất kỳ các tập tin tiêu đề đặt tên như phụ thuộc, là nhật thường xuyên hơn đối tượng tập tin, hoặc nếu đối tượng tập tin không tồn tại.

Nó không thay đổi Makefile của bạn kích hoạt nó.

make clean xóa tất cả các tệp đối tượng đã được tạo trong thời gian chờ đợi. Thông thường, không cần phải biên soạn lại một phần, nghĩa là chỉ biên dịch lại các tệp bạn đã thay đổi và cuối cùng liên kết các tệp đối tượng mới được tạo với các tệp đã tồn tại trước đó. Tuy nhiên, nếu bạn muốn hoàn toàn an toàn, bạn nên chạy make clean trước khi chạy lại make.

Ví dụ về việc giữ các tệp đối tượng cũ (tức là không bao giờ chạy làm sạch) có thể trở thành vấn đề: Giả sử bạn có một tệp đối tượng đã tồn tại được liên kết với phiên bản 1.0 của một số thư viện. Bây giờ bạn cập nhật máy của bạn và điều này sẽ cài đặt phiên bản 1.1 trên nó, trong đó một số chức năng không tương thích với chức năng 1.0. Nhưng kể từ khi tập tin đối tượng của bạn được biên dịch mong đợi phiên bản trước, quá trình liên kết cuối cùng sẽ thất bại.

+0

Tôi không bị thuyết phục bởi ví dụ của bạn. Nếu một bản cập nhật cho một thư viện thay đổi giao diện của nó, thì bạn sẽ phải thực hiện các thay đổi đối với mã của bạn, điều này sẽ gây ra sự biên dịch lại các đối tượng bị ảnh hưởng. Vì vậy, không cần phải "làm sạch" ở đó. – eriktous

+0

Không nhất thiết - nếu phần còn lại của các tệp bạn đang làm việc sẽ không dựa vào thư viện cụ thể đó, các đối tượng bị ảnh hưởng sẽ không được biên dịch lại. – emboss

+0

Nếu bất kỳ đối tượng nào không tương thích với thư viện mới, nguồn của chúng sẽ được thay đổi để phản ánh các thay đổi trong giao diện. Làm một 'làm sạch' sẽ không làm cho nó biến mất, và liên kết sẽ vẫn thất bại. – eriktous

1

Vâng, đó là một câu hỏi rất rộng. Nói chung, bạn có thể viết một makefile sẽ theo dõi tất cả các phụ thuộc (bao gồm cả thời gian sửa đổi riêng của nó). Tuy nhiên nó không tầm thường và các lỗi có thể thu thập dữ liệu tới tệp makefile của bạn giống như bất kỳ mã nào khác. Vì vậy, đôi khi nó dễ dàng hơn để làm sạch mọi thứ và xây dựng lại khi nghi ngờ rằng một cái gì đó đã không được xây dựng một cách chính xác.

Có rất nhiều other build tools, chẳng hạn như scons có thể mạnh mẽ hơn/tự động hơn makefile.

1

Thực hiện phân tích các trường hợp depedencies được định nghĩa trong Makefiles của bạn và tạo biểu đồ phụ thuộc trong số đó.

Nếu phát hiện thấy bất kỳ điều kiện tiên quyết nào cần thiết bởi các thay đổi đầu ra (nhị phân) nó được xây dựng lại - hoặc ít nhất là phần đã thay đổi.

Vì vậy, nếu phụ thuộc của bạn bao gồm Makefiles - có thể không nên - thực hiện sẽ cập nhật nhị phân khi bạn thay đổi Makefile.

Cuộc sống với Makefiles không phải lúc nào cũng dễ dàng hơn nhưng nó có thể giúp bạn rất nhiều.

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