2012-10-13 11 views
6

Trong một số dự án của tôi, tôi sử dụng một số bước dựng sẵn được định cấu hình trong tệp .pro. Vì vậy, qmake sẽ thực hiện bước này bất cứ khi nào nó được kích hoạt.Buộc QtCreator chạy "qmake" khi xây dựng

Bây giờ trong QtCreator, khi tôi xây dựng (cũng khi hoàn toàn xây dựng lại toàn bộ dự án), nó không phải lúc nào cũng chạy qmake, vì nó cố gắng thông minh và tối ưu hóa điều này. Nó chỉ chạy nó khi tệp .pro đã được thay đổi, gây ra một số vấn đề.

Cũng là một vấn đề phổ biến là, khi bạn thực hiện một lớp kế thừa từ QObject sau chạy qmake trong hồ sơ đó, nó sẽ không nhận thấy nó và do đó không chạy moc trên đó. Các vấn đề như vậy được giải quyết bằng cách chỉ cần chạy thủ công qmake thông qua menu "Xây dựng" trong QtCreator. Nhưng nếu tôi quên điều này tôi đôi khi bị nhầm lẫn bởi các lỗi biên dịch tôi nhận được vì điều này và điều này thực sự gây phiền nhiễu.

(Làm thế nào) tôi có thể buộc QtCreator thực hiện bước này luôn luôn khi xây dựng một dự án?

Tôi nghĩ về việc thêm qmake như một xây dựng bước trong cấu hình dự án, nhưng điều này có vẻ là một bẩn hack để giải quyết vấn đề này.

Trả lời

1

Tôi nghĩ tùy chọn tốt nhất của bạn là tùy chỉnh QtCreator của bạn. Điều này có thể được thực hiện bằng cách viết plugin cho QtCreator hoặc bạn có thể thay đổi mã souce của plugin có tên Qt4ProjectManager, sau đó tự xây dựng nó. Điều này có thể phức tạp, tuy nhiên, có thể là một giải pháp.

6

Một hack bẩn khác nhưng linh hoạt hơn một chút: Trên Linux/Mac, hãy thêm "touch yourprojectfile.pro" làm bước xây dựng hoặc gán cuộc gọi công cụ bên ngoài cho sth. như touch "* .pro" chạy trong thư mục làm việc của các dự án hiện tại của bạn. Khi tập tin chuyên nghiệp bị thay đổi (được bắt chước bằng cách chạm) qmake được thực thi. Không sạch hơn nhiều nhưng công cụ bên ngoài cộng với giải pháp phím nóng linh hoạt hơn việc thêm qmake vào các bước xây dựng của mỗi dự án.

Cập nhật: Cuối cùng tôi đã tìm thấy một giải pháp hoàn toàn thỏa đáng cho việc này. Trong tập tin add pro:

qmakeforce.target = dummy 
    qmakeforce.commands = rm -f Makefile ##to force rerun of qmake 
    qmakeforce.depends = FORCE 
    PRE_TARGETDEPS += $$qmakeforce.target 
    QMAKE_EXTRA_TARGETS += qmakeforce 

này xoá nhiệm vụ được tạo ra Makefile một do đó lực lượng qmake để chạy lại cho mỗi xây dựng.

+0

Đây chính xác là những gì tôi đang tìm kiếm! Tôi cũng có một số bước cần phải được thực hiện với mỗi bản dựng để không có Makefile bị xóa mỗi lần khá khó chịu.LƯU Ý: điều này chỉ hợp lệ trên các nền tảng Unix/Linux vì lệnh 'rm' không có sẵn trên Windows. Để đạt được sự thay đổi này, dòng "qmakeforce.commands = rm -f Makefile" thành "qmakeforce.commands = $$ QMAKE_DEL_FILE Makefile". – Hampus

1

Những gì tôi đã làm được tạo ra một makefile gọi rõ ràng qmake. Tất nhiên, điều đó có nghĩa là tôi có hai makefiles, nhưng trong tệp dự án của tôi, tôi có

MAKEFILE = makefile_qt 

có nghĩa là makefile được tạo sẽ có tên đó.

Vì vậy, đối với các makefile tôi tự tạo ra, tôi có:

default: 
    qmake; 
    ${MAKE} -f makefile_qt; 

Sau đó, từ QtCreator, tôi chỉ gọi làm thường xuyên, mà sẽ mặc định makefile. Hoặc bạn có thể để lại makefile do Qt tạo ra, và chỉ cần gọi makeff makefile để gọi cho makefile của bạn. Tôi quên cái đã ưu tiên, makefile hoặc Makefile, và tôi không chắc nó có giống nhau hay không.