Pregunta

¿Hay alguna forma de obtener la versión y el proveedor del compilador utilizado por el usuario a través de qmake? Lo que necesito es deshabilitar la creación de algunos objetivos de mi proyecto cuando se usa g ++ 3.x y habilitarlos cuando se usa g ++ 4.x.

Actualización: La mayoría de las respuestas se dirigieron al preprocesador. Esto es algo que quiero evitar. No quiero que se construya un objetivo para una versión específica del compilador y quiero que esta decisión la tome el sistema de compilación.

¿Fue útil?

Solución

Además de la respuesta de ashcatch , < code> qmake le permite consulta la línea de comandos y vuelve a obtener la respuesta como una variable. Así que podrías hacer algo como esto:

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

Luego, cuando quiera usarlo para especificar objetivos, puede usar las reglas de alcance de configuración:

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

Otros consejos

Mi respuesta se basa en las Caleb Huitt - cjhuitt . Pero su enfoque no funciona para mí.

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

Como puede ver, puede obtener una versión de GCC y luego compararla con expresiones regulares.

La forma de usar es la misma:

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

Para empezar, vería la función de alcance que qmake admite:

Ámbitos y condiciones

Pero mientras leo sobre esto, parece que, por defecto, puedes usar las condiciones generales de la plataforma como win32 o unix o puedes usar el nombre de la especificación qmake como linux-g ++ . Podría probar la versión de Visual Studio de esta manera (ya que las diferentes versiones de Visual Studio usan diferentes especificaciones qmake), pero no creo que pueda probar la versión de gcc de esta manera (al menos no sé cómo).

Yo hago

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

Devuelve " 48 " ;. Lo utilizo para enlazar bibliotecas de boost adecuadas:

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

dando efectivamente: -lboost_system-mgw48-mt-s-1_54

Estoy en mingw.

Otra idea es mirar la variable QMAKESPEC y analizarla, sugerencia:

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

Mi respuesta se basa en respuesta de dismine
Simplemente podemos extraer el número de versión principal usando $$ 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")
}

Cada proveedor de compiladores utiliza para definir algunos símbolos específicos que identifican el compilador y la versión. Puedes hacer el cheque usando esos símbolos.

Sé, por ejemplo, que _MSC_VER proporciona la versión del compilador de Microsoft C ++.

Lo que también sé es que las bibliotecas Boost utilizan este tipo de selección y adaptación de funciones.

Puede consultar los encabezados de Boost Config, que se encuentran en la carpeta de inclusión, en ruta: boost / config / *, especialmente en select_compiler_config.hpp.

Al usar esos símbolos específicos del compilador, puede hacer una selección de características en la fase de preproceso de compilación del código.

Las siguientes macros están definidas en mi versión de gcc y g ++

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

Adicionalmente, el g ++ define:

#define __GNUG__ 4
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top