2012-05-17 20 views
7

Tôi có một dự án mà tôi thường xuyên sửa đổi tiêu đề và khi tôi làm như vậy, và quên make clean sau đó make, tôi nhận được tất cả các loại hành vi kỳ lạ. Tôi hiện đang sử dụng Qt Creator làm IDE của tôi, nhưng tôi đã thấy điều này xảy ra trên một dự án độc lập Qt. Dự án của tôi là nhận được khá lớn, và phải xây dựng lại mỗi khi tôi thực hiện một thay đổi tiêu đề đang trở thành không hiệu quả. Có suy nghĩ gì không?Làm cho không xây dựng lại tiêu đề khi thay đổi

Để tham khảo trong tương lai:

Nếu sử dụng hệ thống qmake:

 
DEPENDPATH += . \ 
    HeaderLocation1/ \ 
    HeaderLocation2/ \ 
    HeaderLocation2/HeaderSubLocation1/ \ 
    HeaderLocation2/HeaderSubLocation2/ \ 
    HeaderLocation2/HeaderSubLocation3/ \ 
    HeaderLocation2/HeaderSubLocation4/ \ 
    HeaderLocation2/HeaderSubLocation5/ \ 
    HeaderLocation3/ \ 
    HeaderLocation3/HeaderSubLocation1/ \ 
    HeaderLocation3/HeaderSubLocation2/ \ 
+0

hành vi Weird bit như ngẫu nhiên của các mã mà tôi đã không thay đổi trong độ tuổi đột nhiên ném lỗi, hoặc thậm chí mã thư viện ném lỗi nội bộ để bản thân .. – Drise

+0

Có vẻ như bạn đang thiếu một số phụ thuộc vào các tiêu đề. – juanchopanza

+0

Lưu ý cần xem xét: Tệp của tôi được tạo tự động bởi QMake, dựa trên tệp Qt .pro của tôi. Sửa đổi Makefile của tôi có phần không phải là một lựa chọn, bởi vì khi tập tin .pro thay đổi, Makefile được tạo lại. – Drise

Trả lời

3

Dont biết gì về IDE của bạn, và không chắc chắn nếu nó có liên quan, và vì bạn không bao gồm makefile của bạn - Tôi sẽ chỉ rõ ràng - bạn có sử dụng bất kỳ phụ thuộc tự động tạo ra?

Đối với g ++ Tôi sử dụng -MD cờ, sau đó trong makefile bao gồm $(wildcard bin/*.d) (tùy thuộc vào nơi đối tượng tập tin của bạn được tạo ra, tôi được tạo ra trong 'bin')

Ngoài ra hãy chắc chắn để xóa các tập tin dep trên clean build

+1

Tôi tin rằng bạn có câu trả lời tốt nhất, bởi vì nó đã dẫn tôi đến đọc thêm về hệ thống thế hệ của QMake, và làm thế nào để thiết lập các phụ thuộc trong các tệp Qt .pro. – Drise

1

này chủ yếu là do sự phụ thuộc giữa các tập tin. Vì vậy, nếu bạn thay đổi tệp .h được bao gồm trong tệp khác, tệp đó cũng sẽ cần phải được biên dịch lại. Vì vậy, hoặc là bạn cần phải giảm bao gồm của bạn, hoặc làm mã hóa của bạn ở dạng .h/.cpp khi có thể thực hiện thay đổi trong .cpp thường xuyên hơn .h.

+0

Lưu ý bổ sung, là nếu bạn đặt chính xác các phụ thuộc của mình trong hệ thống tạo, bạn không phải luôn luôn làm sạch mọi lúc, thay vì chỉ khi bạn thay đổi những gì được bao gồm trong tệp .h. – pippin1289

+0

Tôi làm hầu hết công việc của mình trong các tệp .cpp. Tuy nhiên, nếu tôi cần thêm một hàm mới vào một lớp, hoặc thêm một biến riêng mới, tôi phải thay đổi nó trong tiêu đề. – Drise

+0

Tất nhiên, do đó, vì phụ thuộc bất cứ điều gì bao gồm điều này sẽ được biên dịch lại, do đó, giảm sự phụ thuộc giữa các tập tin có thể giúp đỡ. Chẳng hạn như cẩn thận bao gồm các tệp .h không cần thiết có thể tạo ra sự phụ thuộc trong các tệp khác. Tôi thường cố gắng chỉ bao gồm trong .cpp khi tôi có thể. – pippin1289

2

Giải pháp là có phụ thuộc tiêu đề phù hợp trong makefile của bạn.

1) Sử dụng makedepend để tạo tệp phụ thuộc. Bạn sẽ thêm một mục tiêu vào tệp makefile của bạn để tạo lại tệp phụ thuộc và bạn muốn gọi ra trước khi thực sự biên dịch. 2) Chỉ GCC: Sử dụng tùy chọn '-MMD' và '-MP' trên dòng biên dịch của bạn cho các tệp .c/.cpp. Điều này làm cho GCC tạo ra một tệp phụ thuộc cho tệp đầu vào. Sau đó, bạn có thể bao gồm chúng trong makefile của bạn. Lợi thế ở đây là với hai tùy chọn đó, khi bạn thêm và xóa tiêu đề, nó sẽ hoạt động như bạn mong đợi.

+0

havent sử dụng nó trong nhiều năm, 'makedepend' nghiêm túc có thể làm chậm biên dịch của bạn ... vì vậy tôi muốn nói ở lại khi có thể – nhed

1

Dưới đây là một trích đoạn từ việc tạo tệp makefile của riêng tôi và sử dụng các tệp phụ thuộc được tạo tự động trong khi biên dịch. Bạn sẽ cần phải thực hiện thêm một mục nhập cho các tập tin cpp

%.o : %.c 
    $(CC) -M $(CFLAGS) -o $*.P $< 
    @cp $*.P $*.d; \ 
      sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
       -e '/^$$/ d' -e 's/$$/ :/' < $*.P >> $*.d; \ 
      rm -f $*.P 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

-include *.d 

Dont quên thêm xóa file * .d trên sạch build

5

Re-chạy qmake. Điều này sẽ tạo ra một Makefile mới sẽ có các phụ thuộc thích hợp.

Ví dụ:

Một tập tin file.h trông như sau:

#include "some.h" 
#include "header.h" 
#include "files.h" 
... 

file.cpp trông như sau:

#include "file.h" 
... 

và có trong .pro của bạn:

HEADERS += file.h some.h header.h files.h 
SOURCES += file.cpp 

sẽ tạo ra sau trong kết quả Makefile:

file.o: ../src/file.cpp ../src/file.h \ 
     ../src/some.h \ 
     ../src/header.h \ 
     ../src/files.h 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o file.o ../src/file.cpp 
+0

Đó là câu trả lời! Makefile được tạo ra từ một tệp QMake tự động cập nhật chính nó khi "make" được chạy và một tệp tiêu đề mới đã được thêm vào tệp QMake. Tuy nhiên, nếu tệp tiêu đề mới không được bao gồm trong tệp .cpp tại thời điểm đó, thì không có bản cập nhật phụ thuộc nào được tính và qmake cần phải chạy lại thủ công sau đó. – DCTLib

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