2010-06-02 28 views
7

Để giữ cho dự án Qt của tôi được sắp xếp một chút (sử dụng Qt Creator), tôi có một tệp .pro và nhiều tệp .pri. Mới đây, tôi đã thêm một lớp vào một trong các tệp .pri của tôi có cùng tên tệp như một lớp đã tồn tại trong một tệp .pri riêng biệt.Tên tệp Qt MOC Va chạm sử dụng nhiều tệp .pri

Cấu trúc tệp và makefiles được tạo bởi qmake dường như không biết gì về va chạm tên tệp xảy ra. Các tập tin moc_ * được tạo ra tất cả được ném vào cùng một thư mục con (hoặc là phát hành hoặc gỡ lỗi, tùy thuộc) và một kết thúc ghi đè lên phần còn lại. Khi tôi cố gắng thực hiện dự án, tôi nhận được một số cảnh báo giống như sau:

Makefile.Release:318: warning: overriding commands for target `release/moc_file.cpp` 

Và dự án không liên kết.

Đây là một ví dụ đơn giản về những gì tôi đang nói đến.

Cấu trúc thư mục:

 
+ project_dir 
| + subdir1 
| | - file.h 
| | - file.cpp 
| + subdir2 
| | - file.h 
| | - file.cpp 
| - main.cpp 
| - project.pro 
| - subdir1.pri 
| - subdir2.pri 

Nội dung project.pro:

TARGET = project 
TEMPLATE = app 
include(subdir1.pri) 
include(subdir2.pri) 
SOURCES += main.cpp 

Nội dung subdir1.pri:

HEADERS += subdir1/file.h 
SOURCES += subdir1/file.cpp 

Nội dung subdir2.pri:

HEADERS += subdir2/file.h 
SOURCES += subdir2/file.cpp 

Có cách nào để nói qmake tạo một hệ thống đặt các tệp moc_ * từ các tệp .pri riêng biệt vào các thư mục con riêng biệt không?

Trả lời

3

Điều tốt nhất cần làm là đảm bảo rằng tất cả các tệp đều có một tên duy nhất. Có những công cụ khác ngoài qmake mà cũng sẽ phá vỡ khi bạn cố gắng làm những gì bạn đang làm; bạn cũng có khả năng làm cho nó khó hiểu cho chính mình (ví dụ: hiểu được những gì #include "file.h" sẽ khó hơn).

+0

Tôi không nhất thiết phải đồng ý với lập luận nhầm lẫn của tôi bao gồm báo cáo thường sẽ có dạng: #include "subdir1/file.h" Nontheless, bạn dường như đúng. Các tên tập tin duy nhất dường như là cách duy nhất để đến đây. – Stephen

+0

Tôi tin rằng các tập tin moc và các tập tin đối tượng sẽ không va chạm bây giờ nếu bạn đã theo tôi .. Trái ngược với bình luận của bạn mặc dù :) Đúng tôi nếu tôi là sai .. – liaK

4

Trong subdir1.pri thử phụ

MOC_DIR = "subdir1/MOCFiles" 

Cũng cho subdir2.pri cho

MOC_DIR = "subdir2/MOCFiles" 

Nó không được kiểm tra. Chỉ cần kiểm tra xem nó ra. Hy vọng nó sẽ hoạt động.

Chỉnh sửa 1: Trường hợp MOCFiles là thư mục bạn muốn cho tệp moc của bạn để truy cập.

Chỉnh sửa 2: Tôi vừa ngừng đề cập đến thư mục tệp MOC vì đã được hỏi cụ thể trong câu hỏi. Nhưng ngoài ra bạn cũng có thể phải thêm phần sau đây vào từng tệp pri. (Hãy chắc chắn rằng các thư mục khác nhau đối với các tập tin * .pri khác nhau)

RCC_DIR = "subdir1/RCCFiles" 
UI_DIR = "subdir1/UICFiles" 
OBJECTS_DIR = "subdir1/ObjFiles" 

tôi tin rằng có nhiều file pri có thể làm việc mà không va chạm bằng cách có những cái tên cùng một tập tin. Vì bạn đã chấp nhận một câu trả lời (mà nói rằng nó là không thể), hãy thực hiện các thay đổi ở trên và thử. Hãy cho biết nếu nó không hoạt động.

+0

Không may mắn. Các tệp moc hiện không va chạm với nhau, nhưng các tệp đối tượng (.o) là. Than ôi. – Stephen

+0

Thử đưa OBJECTS_DIR = "subdir2/ObjFiles" – liaK

0

Tôi đã thử điều này trước đây. Câu trả lời ngắn gọn là đặt tên cho chúng khác nhau bằng cách nào đó.Một câu trả lời khác là xử lý từng thư mục con dưới dạng một thư viện riêng biệt, với tệp .pro của riêng nó và sử dụng một loại subdirs để biên dịch tất cả các thư mục thư viện.

Nếu bạn thực sự muốn điều tra câu trả lời đầy đủ, bạn có thể chỉ định công cụ sẽ được sử dụng cho moc. Trong tình huống này, bạn có thể có thể mangle tên để một tên hơi khác nhau được sử dụng cho hai tập tin khác nhau. Tuy nhiên, bạn cũng sẽ cần phải đảm bảo mỗi tệp được đặt tên khác nhau được thêm vào danh sách tệp để biên dịch và liên kết và tệp moc gốc được đặt tên không phải là (hoặc bản dựng của bạn sẽ không thành công).

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