Поиск поставщика/версии компилятора с помощью qmake

StackOverflow https://stackoverflow.com/questions/801279

Вопрос

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

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

Это было полезно?

Решение

В дополнение к пепелответ, 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

Другие советы

Мой ответ основан на Калеб Хьюитт - 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

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

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

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

Я делаю

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-mt-s-1_54

Я на mingw.

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

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

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

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

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

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

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

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

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

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

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

#define __GNUG__ 4
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top