質問

qmakeを通じてユーザーが使用するコンパイラのバージョンとベンダーを取得する方法はありますか?必要なのは、g ++ 3.xが使用されている場合はプロジェクトのターゲットのビルドを無効にし、g ++ 4.xが使用されている場合はそれらを有効にすることです。

更新:ほとんどの回答はプリプロセッサを対象としています。これは避けたいものです。特定のコンパイラバージョン用にターゲットをビルドしたくないので、ビルドシステムによってこの決定が行われるようにします。

役に立ちましたか?

解決

ashcatch の回答に加えて、< code> 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

他のヒント

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

&quot; 48&quot;を返します。 適切なブーストライブラリをリンクするために使用します:

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 Librariesがこの種の機能選択と適応を使用していることです。

パス:boost / config / *、特にselect_compiler_config.hppのincludeフォルダーにあるBoost Configヘッダーを確認できます。

これらのコンパイラ固有のシンボルを使用することにより、コード構築の前処理段階で機能を選択できます。

次のマクロは、私のバージョンのgccおよびg ++で定義されています

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

さらに、g ++が定義するもの:

#define __GNUG__ 4
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top