2008-11-24 29 views

Trả lời

42

http://make.paulandlesley.org/autodep.html có giải pháp tốt.

Tuyệt đối. g ++ -MM sẽ tạo ra một danh sách các phụ thuộc tương thích với GMake. Tôi sử dụng một cái gì đó như thế này:

# Add .d to Make's recognized suffixes. 
SUFFIXES += .d 

#We don't need to clean up when we're making these targets 
NODEPS:=clean tags svn 
#Find all the C++ files in the src/ directory 
SOURCES:=$(shell find src/ -name "*.cpp") 
#These are the dependency files, which make will clean up after it creates them 
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES)) 

#Don't create dependencies when we're cleaning, for instance 
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS)))) 
    #Chances are, these files don't exist. GMake will create them and 
    #clean up automatically afterwards 
    -include $(DEPFILES) 
endif 

#This is the rule for creating the dependency files 
src/%.d: src/%.cpp 
    $(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF [email protected] 

#This rule does the compilation 
obj/%.o: src/%.cpp src/%.d src/%.h 
    @$(MKDIR) $(dir [email protected]) 
$(CXX) $(CXXFLAGS) -o [email protected] -c $< 

Điều này sẽ tự động tạo phụ thuộc cho mỗi tệp đã thay đổi và biên dịch chúng theo bất kỳ quy tắc nào bạn có. Điều này cho phép tôi chỉ đổ các tệp mới vào thư mục src/và chúng được biên dịch trong các phụ thuộc tự động và tất cả.

+1

Đừng rơi vào cái bẫy này nếu bạn có hơn 100 tác phẩm, bởi vì nó quá chậm lần đầu tiên. Trong trường hợp này, bạn nên sử dụng một cái gì đó được gọi một lần, không phải một lần cho mỗi tệp. Makedepend có thể có tùy chọn này. Tại nơi làm việc, chúng tôi sử dụng tập lệnh perl tùy chỉnh. –

+0

Cảm ơn, tôi sẽ ghi nhớ điều đó. Dự án hiện tại của tôi có khoảng một tá tệp, vì vậy nó không có chi phí lớn. Bên cạnh đó, việc xây dựng ban đầu mất hơn 20 phút, vì vậy tôi luôn chạy nó, đi lấy một ít cà phê và chạy các bản xây dựng gia tăng sau đó. –

+1

Cảm ơn, điều này thực sự đã giúp tôi. Bạn có thể viết '$ (patsubst src /%, obj /%, $ (patsubst% .cpp,%. O, $ <))' đơn giản hơn một chút là '$ (patsubst src /%. Cpp, obj /%. O , $ <) '. Ngoài ra, sẽ không có ý nghĩa hơn khi sử dụng tùy chọn '-MF $ @' thay vì chuyển hướng đầu ra bằng '> $ @'? Trang g ++ man cảnh báo bạn rằng có thể có một số đầu ra gỡ lỗi không mong muốn trên stdout, nhưng bạn không nhận được điều đó với '-MF $ @'. – Maarten

6

Cpp tiền xử lý GNU C có tùy chọn, -MM, tạo ra một bộ phụ thuộc phù hợp dựa trên mẫu bao gồm.

0

Trình biên dịch sao Hỏa C/C++ kỹ thuật số đi kèm với công cụ makedep.

+0

loại nền tảng nào có sẵn cho? –

17

Hiện đã đọc this portion in particular Tôi nghĩ có một giải pháp dễ dàng hơn nhiều, miễn là bạn có phiên bản gcc/g ++ hợp lý được cập nhật. Nếu bạn chỉ cần thêm -MMD-CFLAGS của bạn, xác định một biến OBJS đại diện cho tất cả các file đối tượng của bạn, và sau đó làm:

-include $(OBJS:%.o=%.d) 

thì đó sẽ giúp bạn có cả một hệ thống tự động phụ thuộc xây dựng hiệu quả và đơn giản.

4

Tôi chỉ cần thêm này đến makefile và nó hoạt động độc đáo:

-include Makefile.deps 

Makefile.deps: 
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps 
+0

Tôi biết câu trả lời này là cũ, nhưng đó phải là '* .c', không phải' *. [Ch] '- không cần phải kéo trong mọi' * .h' vào trình biên dịch - vì tất cả chúng nên được bao gồm bởi một số Các tệp '.c' nếu chúng được sử dụng ở tất cả [và nếu chúng không, phụ thuộc không quan trọng]. –

+0

Điều này có bất kỳ lợi ích nào đối với các phụ thuộc theo nguồn không?Có vẻ như bạn sẽ tăng gấp đôi số lượng tiền xử lý chuyển qua tất cả các tệp, vì không có lợi ích thực sự. –

+0

Có cách nào để tái sử dụng đầu ra để tạo ra một công thức Makefile hay một cái gì đó tương tự? – PoVa

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