Frage

Gibt es eine Möglichkeit, die Version und Hersteller des Compilers durch den Benutzer durch qmake verwendet zu bekommen? Was ich brauche, ist bauen einige Ziele meines Projektes zu deaktivieren, wenn g ++ 3.x verwendet wird und es ihnen ermöglichen, wenn g ++ 4.x verwendet wird.

Update: Die meisten Antworten den Präprozessor abgezielt. Dies ist etwas, das ich vermeiden will. Ich will kein Ziel für eine bestimmte Compiler-Version sein, zu bauen, und ich will diese Entscheidung des Build-System vorgenommen werden.

War es hilfreich?

Lösung

Neben ashcatch 's Antwort, qmake Damit können Sie href="http://doc.qt.io/qt-5/qmake-test-function-reference.html#system-command" rel="nofollow noreferrer"> abfragen, um die Befehlszeile und die Antwort zurück als Variable erhalten. So könnte man so etwas zu:

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

Dann später, wenn Sie es verwenden möchten Ziele angeben, können Sie die Config-Scoping-Regeln verwenden:

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

Andere Tipps

Meine Antwort basierend auf Caleb Huitt - cjhuitt 's. Doch sein Ansatz für mich nicht funktioniert.

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

Wie Sie sehen Sie die Version von GCC bekommen und es dann mit regulärem Ausdruck vergleichen.

Die Art und Weise, wie zu benutzen ist das gleiche:

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

Als Start, würde ich an der Scoping-Funktion suchen, die Stützen qmake:

Scopes Bedingungen

Aber während ich darüber gelesen, scheint es, dass Sie standardmäßig allgemeine Plattform Bedingungen wie win32 oder unix verwenden können oder Sie den Namen der qmake spec wie linux-g++ verwenden können. Sie könnten die Visual Studio-Version wie dies testen (da die verschiedenen Visual Studio-Versionen unterschiedliche Qmake Spezifikationen verwenden), aber ich glaube nicht, dass Sie die gcc-Version wie diese testen können (zumindest ich weiß nicht, wie).

ich

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

Es gibt "48". Ich benutze es für die Verknüpfung richtige Boost-Bibliotheken:

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

effektiv zu geben: -lboost_system-mgw48-mt-s-1_54

Ich bin auf mingw.

Eine weitere Idee ist bei QMAKESPEC vaariable zu betrachten und analysieren daraus, Hinweis:

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

Meine Antwort basiert auf dismine Antwort
Wir können einfach die Hauptversionsnummer mit $$ str_member extrahieren

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

Jeder Compiler-Anbieter verwenden, um einige bestimmte Symbole zu definieren, die den Compiler und die Version zu identifizieren. Sie könnten die Kontrolle unter Verwendung dieser Symbole machen.

Ich weiß zum Beispiel, dass _MSC_VER gibt die Version von Microsoft C ++ Compiler.

Was ich weiß auch, dass Boost-Bibliotheken verwenden diese Art von Merkmalsauswahl und Anpassung.

Sie können einen Blick auf Config-Header Boost gefunden in include Ordner auf Pfad:. Boost / config / *, speziell bei select_compiler_config.hpp

diese Compiler bestimmte Symbole verwenden, können Sie Feature-Auswahl treffen bei Vorverarbeitung Phase den Code zu bauen.

Die folgenden Makros in meiner Version von gcc und g definiert ++

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

Additionaly die g ++ definiert:

#define __GNUG__ 4
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top