2009-09-13 30 views
59

Tôi bắt đầu học Qt. Tôi đang chuyển từ thế giới Visual Studio và tôi đang tìm cách tổ chức cấu trúc dự án của mình bằng QMake. Tôi đã tìm thấy mẫu 'subdirs' nhưng tôi có khá nhiều thời gian để hiểu nó.Làm cách nào để sử dụng mẫu phụ của QMake?

cấu trúc dự án của tôi trông như thế này:

project_dir/ 
    main.cpp 
    project.pro 
    logic/ 
     logic.pro 
     some logic files 
    gui/ 
     gui.pro 
     gui files 

My project.pro trông như thế này

TEMPLATE = subdirs 
SUBDIRS = logic \ 
      gui 
SOURCES += main.cpp 

Trong .pro file cho các thư mục con tôi có NGUỒN thích hợp , HEADERSTÀI NGUYÊN biến được đặt.

Hãy cho tôi biết những gì MỤC TIÊU, MẪU và các giá trị cần thiết khác tôi nên đặt trong .pro tập tin.

Ngoài ra, có một số hướng dẫn QMake tốt khác với hướng dẫn chính thức không?

Trả lời

80

Ngoài Troubadour's comment, tôi sẽ lưu ý rằng mục tiêu SUBDIRS chỉ tốt cho việc chỉ định thư mục con. Do đó, dòng thêm bạn

SOURCES += main.cpp 

trong tập tin project.pro của bạn là không chính xác, và có khả năng sẽ thất bại trong việc xây dựng tập tin main.cpp của bạn, lúc tồi tệ nhất. Tốt nhất, qmake sẽ từ chối phân tích tệp, vì nó có thông số kỹ thuật xung đột trong đó.

Tôi đã sử dụng mẫu SUBDIRS một vài lần và nó hoạt động tốt nếu bạn có thể xây dựng các bộ phận thành nhiều thư viện độc lập hơn hoặc ít hơn, dường như bạn có logic và gui riêng biệt. Dưới đây là một cách để làm điều này:

project_dir/ 
-project.pro 
-common.pri 
-logic/ 
----logic.pro 
----some logic files 
-gui/ 
----gui.pro 
----gui files 
-build/ 
----build.pro 
----main.cpp 

project.pro:

TEMPLATE = subdirs 
SUBDIRS = logic \ 
      gui 

# build must be last: 
CONFIG += ordered 
SUBDIRS += build 

chung.pri:

#Includes common configuration for all subdirectory .pro files. 
INCLUDEPATH += . .. 
WARNINGS += -Wall 

TEMPLATE = lib 

# The following keeps the generated files at least somewhat separate 
# from the source files. 
UI_DIR = uics 
MOC_DIR = mocs 
OBJECTS_DIR = objs 

logic/logic.pro:

# Check if the config file exists 
! include(../common.pri) { 
    error("Couldn't find the common.pri file!") 
} 

HEADERS += logic.h 
SOURCES += logic.cpp 

# By default, TARGET is the same as the directory, so it will make 
# liblogic.a (in linux). Uncomment to override. 
# TARGET = target 

gui/gui.pro:

! include(../common.pri) { 
    error("Couldn't find the common.pri file!") 
} 

FORMS += gui.ui 
HEADERS += gui.h 
SOURCES += gui.cpp 

# By default, TARGET is the same as the directory, so it will make 
# libgui.a (in linux). Uncomment to override. 
# TARGET = target 

build/build.pro:

TEMPLATE = app 

SOURCES += main.cpp 

LIBS += -L../logic -L../gui -llogic -lgui 

# Will build the final executable in the main project directory. 
TARGET = ../project 
+0

Điểm tốt về chỉ thị SOURCES trong project.pro. Tôi đã bỏ lỡ điều đó. – Troubadour

+0

Cảm ơn câu trả lời toàn diện này. Đó là một điểm tốt để bắt đầu việc học của tôi. – zarzych

+0

Đó là ấn tượng của tôi rằng "đặt hàng" là toàn cầu. Nó dường như không làm cho hai thư viện đầu tiên đồng thời. –

16

Bạn sử dụng subdirs nếu thư mục logic và gui thực sự repentent một số loại mục tiêu, ví dụ: một thư viện, có thể được xây dựng độc lập với bất kỳ thứ gì khác. Nếu đúng như vậy, chỉ cần sử dụng

TEMPLATE = lib 
TARGET = logic 
CONFIG += dll 

trong logic.pro.

Nếu họ không mục tiêu độc lập nhưng chỉ là thư mục mà tồn tại để tổ chức các tập tin nguồn sau đó bạn chỉ có thể sử dụng một tập tin .pri trong mỗi thay vào đó và bao gồm chúng trong .pro sử dụng

include(logic/logic.pri) 
include(gui/gui.pri) 

Chỉ cần nhớ rằng đường dẫn tệp trong tệp .pri có liên quan đến tệp .pro và không phải là .pri. BTW, việc sử dụng tệp .pri là tùy chọn vì bạn vẫn có thể liệt kê các tệp trong các thư mục đó trực tiếp trong tệp .pro. Các tập tin .pri chỉ làm cho nó rằng bit neater và giúp giữ các tập tin .pro ngắn hơn.

+2

Từ những gì tôi đã học được, phương thức tệp .pri làm cho Trình tạo Qt hiển thị thư mục con cho mỗi tệp .pri và tiếp theo của nó ents. – zarzych

+3

@zarzych: Đó là sự thật nhưng nó cũng khó chịu không tôn trọng nơi tệp .pri nằm trong hệ thống tệp và chỉ hiển thị chúng dưới dạng danh sách phẳng ở cấp .pro. Đặc biệt gây phiền nhiễu nếu bạn có nhiều tên có cùng tên. – Troubadour

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