Поиск поставщика / версии компилятора с помощью qmake - PullRequest
9 голосов
/ 29 апреля 2009

Есть ли способ получить версию и производителя компилятора, используемого пользователем через qmake? Мне нужно отключить создание некоторых целей моего проекта при использовании g ++ 3.x и включить их при использовании g ++ 4.x.

Обновление: Большинство ответов были нацелены на препроцессор. Это то, чего я хочу избежать. Я не хочу, чтобы цель была собрана для конкретной версии компилятора, и я хочу, чтобы это решение принималось системой сборки.

Ответы [ 7 ]

13 голосов
/ 30 апреля 2009

В дополнение к ответу ashcatch , qmake позволяет вам запросить командную строку и получить ответ обратно в виде переменной. Таким образом, вы могли бы что-то вроде этого:

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" )
    }
}

Затем, когда вы захотите использовать его для указания целей, вы можете использовать правила определения конфигурации:

SOURCES += blah blah2 blah3
g++4: SOURCES += blah4 blah5
4 голосов
/ 07 августа 2016

Мой ответ основан на Caleb Huitt - cjhuitt . Но его подход не работает для меня.

*-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" )
            }
        }
    }
}

Как видите, вы можете получить версию из GCC, а затем сравнить ее с выражением регулярного выражения.

Способ использования такой же:

SOURCES += blah blah2 blah3
g++4: SOURCES += blah4 blah5
2 голосов
/ 29 апреля 2009

Для начала я бы посмотрел на функцию определения объема, которую поддерживает qmake:

Области применения и условия

Но хотя я читал об этом, похоже, что по умолчанию вы можете использовать общие условия платформы, такие как win32 или unix, или вы можете использовать имя спецификации qmake, например, linux-g++. Вы можете протестировать версию Visual Studio следующим образом (поскольку разные версии Visual Studio используют разные спецификации qmake), но я не думаю, что вы можете протестировать версию gcc вот так (по крайней мере, я не знаю как).

1 голос
/ 16 ноября 2017

Мой ответ основан на dismine's ответ
Мы можем просто извлечь номер основной версии, используя $$ 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")
}
1 голос
/ 04 июля 2013

Я делаю

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)
}

Возвращает "48". Я использую его для связывания правильных библиотек наддува:

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

эффективно дает: -lboost_system-mgw48-т-ы-1_54

Я нахожусь на mingw.

Другая идея - посмотреть на переменную QMAKESPEC и разобрать ее, подсказка:

message(QMAKESPEC $$QMAKESPEC)
SPLITED=$$section(QMAKESPEC, "/", 0, -3)
message(SPLITED $$SPLITED)
0 голосов
/ 29 апреля 2009

Следующие макросы определены в моей версии gcc и g ++

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

Дополнительно g ++ определяет:

#define __GNUG__ 4
0 голосов
/ 29 апреля 2009

Каждый поставщик компилятора использует определенные символы, которые идентифицируют компилятор и версию. Вы можете сделать проверку, используя эти символы.

Я знаю, например, что _MSC_VER предоставляет версию компилятора Microsoft C ++.

Что я также знаю, так это то, что библиотеки повышения используют этот тип выбора и адаптации функций.

Вы можете взглянуть на заголовки Boost Config, находящиеся в папке include, по пути: boost / config / *, особенно в select_compiler_config.hpp.

Используя эти символы, специфичные для компилятора, вы можете выбирать функции на этапе предварительной обработки кода.

...