Sự khác biệt giữa: = và = trong Makefile là gì?


Câu trả lời:


76

Điều này được mô tả trong tài liệu GNU Make, trong phần có tiêu đề 6.2 Hai hương vị của các biến .

Nói tóm lại, các biến được định nghĩa với :=được mở rộng một lần, nhưng các biến được xác định với =được mở rộng bất cứ khi nào chúng được sử dụng.


4
Vì vậy, sẽ chính xác nếu nói rằng: = hiệu quả hơn? Hay hiệu quả không thực sự là một yếu tố với Makefiles?
Ungeheuer

3
@Ungeheuer Đó không phải là một vấn đề vì quá trình gọi ( makecông việc chính của) có chi phí lớn hơn nhiều so với việc giải quyết biến nội bộ như vậy.
Kirill Bulygin

62

Bài tập đơn giản :=

Một biểu thức gán đơn giản chỉ được đánh giá một lần, ở lần xuất hiện đầu tiên. Ví dụ, nếu CC :=${GCC} ${FLAGS}trong lần gặp đầu tiên được đánh giá là gcc -Wsau đó mỗi lần ${CC}xảy ra nó sẽ được thay thế bằng gcc -W.

Bài tập đệ quy =

Biểu thức gán đệ quy được đánh giá mỗi khi gặp biến trong mã. Ví dụ, một câu lệnh like CC = ${GCC} {FLAGS}sẽ chỉ được đánh giá khi một hành động like ${CC} file.cđược thực thi. Tuy nhiên, nếu biến GCCđược gán lại, tức là GCC=c++biến ${CC}sẽ được chuyển thành c++ -Wsau khi gán lại.

Chuyển nhượng có điều kiện ?=

Phép gán có điều kiện chỉ gán giá trị cho một biến khi nó không có giá trị

Xuất hiện +=

Giả sử rằng CC = gccsau đó các nhà điều hành phụ được sử dụng như CC += -w
sau đó CChiện nay có giá trịgcc -W

Để biết thêm, hãy xem các hướng dẫn này


"Một biểu thức gán đơn giản chỉ được đánh giá một lần, ngay lần xuất hiện đầu tiên": nói rõ ràng, việc mở rộng / đánh giá được thực hiện khi biến được xác định, không phải lần đầu tiên nó được sử dụng.
Michael Burr

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.