2013-09-06 65 views
16

Tôi đã cài đặt nhiều phiên bản Qt và tôi cần biên dịch dự án của mình với tất cả chúng.
Sử dụng tệp chuyên nghiệp, tôi không thể tìm thấy trong tài liệu hướng dẫn cách thực hiện biên dịch có điều kiện.Cách kiểm tra phiên bản Qt đã chọn trong tệp .pro?

Lý tưởng nhất, đây là những gì tôi muốn làm:

QT_VERSION = 5 # this can be 4, set manually 

if(QT_VERSION == 5) { 
    QT += widgets 
} 
if(QT_VERSION == 4) { 
    QT += gui 
} 

Đương nhiên, nếu() lệnh không tồn tại trong các tập tin chuyên nghiệp.
Có cách nào tốt hơn để làm điều tương tự không?

+1

có thể là một lựa chọn không? – brunocodutra

+0

Tôi luôn sử dụng cmake khi có thể. Tôi e rằng đây không phải là trường hợp. – Pietro

Trả lời

20

Bạn có thể sử dụng chức năng có điều kiện và phạm vi ở đây:

QT_VERSION = 5 # this can be 4, set manually 

equals(QT_VERSION, 5){ 
    QT += widgets 
} 
equals(QT_VERSION, 4) { 
    QT += gui 
} 

Tuy nhiên, có một vài điều mà bạn cần phải chú ý đến trong mã ban đầu của bạn:

  1. Rõ ràng quy định Phiên bản Qt là không cần thiết, và nó có thể khiến bạn bị nhức đầu nếu bạn quên thay đổi điều đó trong tệp .pro. Thay vào đó, qmake sẽ tự động xác định biến số QT_MAJOR_VERSION cho bạn.

  2. Sử dụng equals sẽ hoạt động trong trường hợp này. Tuy nhiên, như đã nêu bên dưới, equals thực hiện so sánh chuỗi. Tuy nhiên, tốt hơn nên sử dụng greaterThanlessThan vì mã của bạn sẽ tự động ngừng hoạt động khi bạn cố gắng biên dịch mã với Qt 6 (một nơi nào đó trong tương lai).

  3. Thêm gui vào số QT là không cần thiết vì được bao gồm theo mặc định.

Vì vậy, mã của bạn nên là:

greaterThan(QT_MAJOR_VERSION, 4) { 
    QT += widgets 
} 

Dưới đây là một số undocumented qmake gems:

  • defined(func, type) 
    

    trả về true nếu func được xác định; loại phải là test hoặc replace, để khớp với defineTest hoặc defineReplace.

  • equals(var1, var) 
    

    (cũng hoạt động như isEqual).
    Trả về true nếu var1 bằng var2 (so sánh chuỗi).

  • lessThan(var1, var2)` 
    

    trả về true nếu var1 là ít hơn var2 (như một số nguyên).

  • greaterThan(var1, var2) 
    

    trả về true nếu var1 lớn hơn var2 (như một số nguyên).

  • inFile(file, var, val) 
    

    Trả về true nếu một biến số var được xác định trong tệp được chỉ định. Ngoài ra, nó có thể kiểm tra xem nó có giá trị được yêu cầu hay không.

  • load(string) 
    

    Something của sự pha trộn giữa include()CONFIG += [feature]. load(foo) sẽ tìm tệp có tên "foo.prf" trong đường dẫn tính năng chuẩn và thực thi nội dung ngay lập tức. Các tính năng được chứa trong CONFIG được thực thi cuối cùng, sau khi tệp ".pro" đã xử lý xong. Giống như include(), nó sẽ trả về true nếu tệp được tìm thấy.

3

Đây là một thử nghiệm đơn giản để thực hiện. Đây là những gì chúng tôi đã làm trong QtSerialPort và cũng có một số module khác trong khuôn khổ Qt:

lessThan(QT_MAJOR_VERSION, 5) { 
... 
} else { 
... 
} 

điều kiện tương tự và phổ biến là:

contains(QT_MAJOR_VERSION, 5): ... 

hay:

greaterThan(QT_MAJOR_VERSION, 4): ... 

Here bạn có thể tìm thấy một ví dụ khác về QtSerialPort mà chúng tôi đã làm trong đó.