2009-04-29 40 views
9

Có cách nào để lấy phiên bản và nhà cung cấp trình biên dịch được người dùng sử dụng thông qua qmake không? Những gì tôi cần là để vô hiệu hóa xây dựng một số mục tiêu của dự án của tôi khi g ++ 3.x được sử dụng và kích hoạt chúng khi sử dụng g ++ 4.x.Tìm nhà cung cấp/phiên bản trình biên dịch bằng cách sử dụng qmake

Cập nhật: Hầu hết các câu trả lời đều nhắm mục tiêu đến bộ tiền xử lý. Đây là điều mà tôi muốn tránh. Tôi không muốn một mục tiêu được xây dựng cho một phiên bản trình biên dịch cụ thể và tôi muốn quyết định này được thực hiện bởi hệ thống xây dựng.

Trả lời

13

Ngoài ashcatch 's câu trả lời, qmake cho phép bạn query the command line và nhận được phản hồi trở lại dưới dạng biến. Vì vậy, bạn có thể để một cái gì đó như thế này:

linux-g++ { 
    system(g++ --version | grep -e "\<4.[0-9]") { 
     message("g++ version 4.x found") 
     CONFIG += g++4 
    } 
    else system(g++ --version | grep -e "\<3.[0-9]") { 
     message("g++ version 3.x found") 
     CONFIG += g++3 
    } 
    else { 
     error("Unknown system/compiler configuration") 
    } 
} 

Rồi sau đó, khi bạn muốn sử dụng nó để xác định mục tiêu, bạn có thể sử dụng các quy tắc cấu hình Phạm vi:

SOURCES += blah blah2 blah3 
g++4: SOURCES += blah4 blah5 
+0

Perfect nhờ. Tôi đã suy nghĩ về việc làm một cái gì đó như thế nhưng tôi nghĩ rằng tôi sẽ hỏi nếu có cái gì đó đã được hỗ trợ ra khỏi hộp. Vì dường như không phải giải pháp của bạn đã sẵn sàng để sử dụng :-) –

+0

@Caleb: có thể đơn giản hóa nếu bạn sử dụng lệnh 'gcc -dumpversion', điều này có thể khiến cho grep thừa. Tôi có thể chỉnh sửa câu trả lời của bạn hoặc tôi sẽ viết một câu trả lời khác không? – user23573

+0

@BogdanWilli Hãy thoải mái. –

0

Mỗi nhà cung cấp trình biên dịch sử dụng để xác định một số ký hiệu cụ thể xác định trình biên dịch và phiên bản. Bạn có thể thực hiện việc kiểm tra bằng các biểu tượng đó.

Tôi biết, ví dụ: _MSC_VER cung cấp phiên bản trình biên dịch Microsoft C++.

Điều tôi cũng biết là Thư viện nâng cao sử dụng loại lựa chọn tính năng này và thích ứng.

Bạn có thể xem qua tiêu đề Tăng cấu hình, được tìm thấy trong thư mục bao gồm, tại đường dẫn: boost/config/*, đặc biệt tại select_compiler_config.hpp.

Bằng cách sử dụng các biểu tượng trình biên dịch cụ thể đó, bạn có thể thực hiện lựa chọn tính năng ở giai đoạn tiền xử lý xây dựng mã.

2

Như một sự khởi đầu, tôi sẽ xem xét các tính năng Phạm vi mà qmake hỗ trợ:

Scopes and Conditions

Nhưng khi tôi đọc về nó, có vẻ như theo mặc định bạn có thể sử dụng điều kiện nền tảng chung chung như win32 hay unix hoặc bạn có thể sử dụng tên của thông số qmake như linux-g++. Bạn có thể kiểm tra phiên bản Visual Studio như thế này (vì các phiên bản Visual Studio khác nhau sử dụng thông số kỹ thuật qmake khác nhau), nhưng tôi không nghĩ rằng bạn có thể kiểm tra phiên bản gcc như thế này (ít nhất tôi không biết làm thế nào).

0

Các macro sau đây được định nghĩa trong phiên bản của tôi về gcc và g ++

#define __GNUC__ 4 
#define __GNUC_MINOR__ 0 
#define __GNUC_PATCHLEVEL__ 1 

Additionaly g ++ định nghĩa:

#define __GNUG__ 4 
1

tôi làm

isEmpty(MGWVER) { 
    MGW_MAJ = $$system(echo | gcc -dM -E - | fgrep __GNUC__ | cut -d\" \" -f 3) 
    MGW_MIN = $$system(echo | gcc -dM -E - | fgrep __GNUC_MINOR__ | cut -d\" \" -f 3) 
    MGWVER =$$MGW_MAJ$$MGW_MIN 
    message(MGWVER $$MGWVER) 
} 

Nó trả về "48". tôi sử dụng nó để liên kết thư viện tăng thích hợp:

USER_BOOST_CFG=mgw$${MGWVER}-mt-s-$$(BOOST_VER) 
message($$USER_BOOST_CFG) 
LIBS *= -L$$(BOOST_ROOT)/lib 
LIBS *= -L$$(BOOST_ROOT)/stage/lib 

LIBS *= -lboost_system-$$USER_BOOST_CFG 
LIBS *= -lboost_filesystem-$$USER_BOOST_CFG 
LIBS *= -lboost_date_time-$$USER_BOOST_CFG 

cho hiệu quả: -lboost_system-mgw48-mt-s-1_54

Tôi đang trên mingw.

ý tưởng khác là để nhìn vào QMAKESPEC vaariable và phân tích từ nó, gợi ý:

message(QMAKESPEC $$QMAKESPEC) 
SPLITED=$$section(QMAKESPEC, "/", 0, -3) 
message(SPLITED $$SPLITED) 
+0

điều này không hoạt động trên Qt 5.4 (Bộ chọn lọc: Màn hình Qt 5.4.1 MinGW 32 bit) 'fgrep' không khả dụng. – user23573

+0

fgrep không phải là một phần của qt. Bạn cần http://gnuwin32.sourceforge.net/. Tôi khuyên bạn nên cài đặt https://chocolatey.org/ và hơn 'choco install gnuwin'. Mọi thứ từ dòng lệnh hoặc tập lệnh – fantastory

3

câu trả lời của tôi dựa trên Caleb Huitt - cjhuitt 's. Nhưng cách tiếp cận của anh ấy không hiệu quả với tôi.

*-g++ { 
    GCC_VERSION = $$system("g++ -dumpversion") 
    contains(GCC_VERSION, 6.[0-9]) { 
     message("g++ version 6.x found") 
     CONFIG += g++6 
    } else { 
     contains(GCC_VERSION, 5.[0-9]) { 
      message("g++ version 5.x found") 
      CONFIG += g++5 
     } else { 
      contains(GCC_VERSION, 4.[0-9]) { 
       message("g++ version 4.x found") 
       CONFIG += g++4 
      } else { 
       message("Unknown GCC configuration") 
      } 
     } 
    } 
} 

Như bạn thấy bạn có thể nhận phiên bản từ GCC và sau đó so sánh nó với biểu thức chính quy.

Cách làm thế nào để sử dụng là như nhau:

SOURCES += blah blah2 blah3 
g++4: SOURCES += blah4 blah5 
0

câu trả lời của tôi là dựa trên dismine's answer
Chúng tôi chỉ có thể trích xuất các số phiên bản chính sử dụng $$ str_member

gcc | clang { 
    COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion") 
    COMPILER_MAJOR_VERSION = $$str_member($$COMPILER_VERSION) 
    greaterThan(COMPILER_MAJOR_VERSION, 3): message("gcc 4 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 4): message("gcc 5 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 5): message("gcc 6 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 6): message("gcc 7 or later") 
} 
Các vấn đề liên quan