Tôi có một dự án có một makefile với các phụ thuộc bị hỏng. Có cách nào nổi tiếng nhất để tạo ra một danh sách các phụ thuộc cho dự án mà tôi có thể sử dụng trong makefile, ngoài việc kiểm tra từng tệp nguồn bằng tay hoặc bằng một script viết tay perl?tạo phụ thuộc cho một makefile cho một dự án trong C/C++
Trả lời
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ả.
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.
Trình biên dịch sao Hỏa C/C++ kỹ thuật số đi kèm với công cụ makedep.
loại nền tảng nào có sẵn cho? –
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.
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
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]. –
Đ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ự. –
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
- 1. Đường dẫn tạo phụ thuộc GCC makefile
- 2. Tại sao một số dự án chọn phần mở rộng cho tệp nguồn .cc trong C++?
- 3. Tạo tất cả các phụ thuộc của dự án trong một tệp đơn bằng cờ gcc -MM
- 4. Làm cách nào để tạo một dự án Makefile cho C với các thư mục con SRC, OBJ và BIN?
- 5. CMake: Phụ thuộc của một dự án bên ngoài
- 6. tạo một thư viện lớp cho một dự án sharepoint
- 7. Phụ thuộc Maven vs quản lý phụ thuộc cho nhiều dự án
- 8. Cách lấy qmake để tạo "phụ thuộc dự án" trong dự án Visual Studio .sln
- 9. Tự động liệt kê các phụ thuộc cho một dự án
- 10. Kiểm tra SBT-phụ thuộc vào Multiprojects: Làm cho mã kiểm tra có sẵn cho các dự án phụ thuộc
- 11. Phụ thuộc dự án Web Eclipse
- 12. CC? = Trong Makefile có nghĩa là gì?
- 13. QtCreator nhập dự án makefile
- 14. Làm thế nào để làm cho Jenkins kích hoạt một xây dựng trên một dự án phụ thuộc khi một phụ thuộc là xây dựng
- 15. Tạo một Javadoc cho dự án Android của tôi
- 16. Bỏ qua việc tạo phụ thuộc vào makefile cho các mục tiêu nhất định (ví dụ: `clean`)
- 17. Tìm phụ thuộc của makefile
- 18. gỡ lỗi dự án makefile trong eclipse
- 19. Dự án thiết lập Visual Studio 2010 - một dự án cho cả 64 và 32
- 20. Có phải phụ thuộc vào một liên kết có thể có trong Makefile không?
- 21. Tạo một makefile FORFAN
- 22. Tạo một dự án, từ Makefile đến các thư viện tĩnh/động trong UNIX
- 23. Làm cách nào để tải xuống các nguồn phụ thuộc cho dự án Gradle trong IDEA?
- 24. Làm thế nào để có phụ thuộc dự án khác nhau cho mỗi cấu hình dự án?
- 25. Phụ thuộc mục tiêu giữa hai dự án trong cùng một không gian làm việc
- 26. Phụ thuộc mô-đun Java EE trong dự án web?
- 27. Dự án Grails - Java Project chung phụ thuộc trong Eclipse
- 28. Bất kỳ công cụ để kiểm tra phụ thuộc vòng tròn trong một dự án Delphi
- 29. CMake - phụ thuộc (tiêu đề) giữa các ứng dụng/thư viện trong cùng một dự án
- 30. Cách đặt điểm ngắt trong dự án xcode phụ thuộc
Đừ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. –
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 đó. –
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