Поиск поставщика/версии компилятора с помощью qmake
-
03-07-2019 - |
Вопрос
Есть ли способ получить версию и поставщика компилятора, используемого пользователем, через 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