Domanda

Esiste un modo per ottenere la versione e il fornitore del compilatore utilizzato dall'utente tramite qmake? Ciò di cui ho bisogno è disabilitare la creazione di alcuni obiettivi del mio progetto quando si utilizza g ++ 3.x e abilitarli quando si utilizza g ++ 4.x.

Aggiornamento: la maggior parte delle risposte ha come target il preprocessore. Questo è qualcosa che voglio evitare. Non voglio che venga creato un target per una specifica versione del compilatore e voglio che questa decisione sia presa dal sistema di compilazione.

È stato utile?

Soluzione

Oltre alla ashcatch la risposta, < code> qmake ti permette di interrogare la riga di comando e ottenere la risposta come variabile. Quindi potresti fare qualcosa del genere:

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

Successivamente, quando si desidera utilizzarlo per specificare le destinazioni, è possibile utilizzare le regole di ambito di configurazione:

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

Altri suggerimenti

La mia risposta si basa sui Caleb Huitt - cjhuitt . Ma il suo approccio non funziona per me.

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

Come vedi puoi ottenere la versione da GCC e poi confrontarla con l'espressione regex.

Il modo in cui usare è lo stesso:

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

Come prima cosa, guarderei la funzione di scoping supportata da qmake:

Ambiti e condizioni

Ma mentre lo leggo, sembra che per impostazione predefinita sia possibile utilizzare condizioni generali della piattaforma come win32 o unix o è possibile utilizzare il nome della specifica qmake come linux-g ++ . Potresti testare la versione di Visual Studio in questo modo (poiché le diverse versioni di Visual Studio usano specifiche qmake diverse), ma non penso che puoi testare la versione di gcc in questo modo (almeno non so come).

Lo faccio

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

Restituisce "48". Lo uso per collegare le librerie boost appropriate:

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 effettivamente: -lboost_system-mgw48-Mt-s-1_54

Sono su Mingw.

Un'altra idea è quella di guardare il Vaariable QMAKESPEC e analizzarlo, suggerimento:

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

La mia risposta si basa su risposta di dismine
Possiamo semplicemente estrarre il numero di versione principale 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")
}

Ogni fornitore del compilatore utilizza per definire alcuni simboli specifici che identificano il compilatore e la versione. È possibile effettuare il controllo utilizzando questi simboli.

So, ad esempio, che _MSC_VER fornisce la versione del compilatore Microsoft C ++.

Quello che so anche è che Boost Libraries usa questo tipo di selezione e adattamento delle funzionalità.

Puoi dare un'occhiata alle intestazioni Boost Config, che si trovano nella cartella include, nel percorso: boost / config / *, specialmente su select_compiler_config.hpp.

Utilizzando questi simboli specifici del compilatore, è possibile effettuare la selezione delle funzionalità durante la fase di preelaborazione della creazione del codice.

Le seguenti macro sono definite nella mia versione di gcc e g ++

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

Inoltre g ++ definisce:

#define __GNUG__ 4
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top