CMakeの新しいGCCパスを指定する方法


122

私のOSはcentosで、パスにデフォルトのgccがあります/usr/bin/gcc。しかし、それは古いので、新しいバージョンのgccが必要です。だから私は新しいパスに新しいバージョンをインストールします/usr/local/bin/gcc

しかし、実行cmakeすると、古いバージョンのgcc path(/usr/bin/gcc)が使用されます。gccを新しいパス(/usr/local/bin/gcc)に指定するにはどうすればよいですか。

私は、上書きしようとしてい/usr/bin/gcc/usr/local/bin/gcc、それが動作しません。


2
/optではなくに代替のgccバージョンをインストールすることをお勧めし/usr/localます。できれば/opt/gcc-x.y.z。これにより、さらに新しいバージョンが必要になった場合でも、以前のバージョンをアンインストールするのに問題はありません。
user666412

回答:


219

上書きせずCMAKE_C_COMPILER、cmakeを呼び出す前にエクスポートCC(およびCXX)します。

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make

エクスポートは、プロジェクトを初めて構成するときに一度だけ行う必要があります。その後、これらの値はCMakeキャッシュから読み取られます。


更新CMAKE_C(XX)_COMPILERジェイクのコメントの後にオーバーライドしない理由についてのより長い説明

CMAKE_C(XX)_COMPILER2つの主な理由で値を上書きしないことをお勧めします。CMakeのキャッシュではうまく機能しないことと、コンパイラチェックとツールの検出を壊すことです。

setコマンドを使用する場合、3つのオプションがあります。

  • キャッシュなし、通常の変数を作成する
  • キャッシュ付き、キャッシュされた変数を作成する
  • 構成時に常にキャッシュ値を強制するための強制キャッシュ

への可能な3つの呼び出しで何が起こるか見てみましょうset

キャッシュなし

set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)

これを行う場合CMAKE_C(XX)_COMPILER、同じ名前のキャッシュ変数を非表示にする「通常の」変数を作成します。これは、コンパイラがビルドスクリプトでハードコードされ、カスタム値を指定できないことを意味します。これは、コンパイラが異なる複数のビルド環境がある場合に問題になります。別のコンパイラを使用するたびにスクリプトを更新するだけで、最初にCMakeを使用する価値がなくなります。

では、キャッシュを更新しましょう...

キャッシュあり

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")

このバージョンは「機能しない」だけです。CMAKE_C(XX)_COMPILER変数がすでにキャッシュ内にあるので、あなたはそれを強制しない限り、それは更新されません。

あ...力を使ってみよう...

強制的にキャッシュ

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)

これは「通常の」変数バージョンとほぼ同じです。唯一の違いは、ユーザーの値がキャッシュに設定されるため、ユーザーが確認できることです。ただし、変更はsetコマンドによって上書きされます。

コンパイラチェックとツールの破壊

構成プロセスの初期に、CMakeはコンパイラーのチェックを実行します。実行可能ファイルを生成できますか?など。また、コンパイラを使用して、arおよびなどの関連ツールを検出しますranlib。スクリプトのコンパイラ値をオーバーライドすると、「遅すぎる」ので、すべてのチェックと検出がすでに行われています。

たとえば、gccをデフォルトのコンパイラとして使用しているマシンでは、settoコマンドを使用すると/usr/bin/clangarに設定され/usr/bin/gcc-ar-7ます。CMakeを実行する前にエクスポートを使用すると、エクスポートはに設定され/usr/lib/llvm-3.8/bin/llvm-arます。


$ PATHに適切なコンパイラーが設定されている場合のレイジーと同等:> export CC = which gcc > export CXX =which g++
gerardw

11
$ PATHに適切なコンパイラーが設定されている場合、遅延と同等: export CC=`which gcc` export CXX=`which g++`
gerardw

CC / CXXは、パスと異なる場合は、私が取得Incorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
リリス・リバー

1
Windowsを使用している場合、どうすればよいですか?
mr5 2016年

5
実際にはCMAKE_C_COMPILER、コマンドラインを使用して設定すれば、設定はうまく機能します$ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
Erwan Legrand 2017年

25

この質問はかなり古いですが、それでもGoogle検索で出てきます。受け入れられた質問は、私にとってはもはや機能せず、高齢のようです。cmakeに関する最新情報はcmake FAQに記載されています

コンパイラのパスを変更するには、さまざまな方法があります。一つの方法は

CMAKE_FOO_COMPILERを使用して、コマンドラインで適切な変数を有効なコンパイラ名またはフルパスに設定しcmake -Dます。例えば:

cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source

gcc-4.2あなたの代わりにpath/to/your/compilerこのように書くことができます

 cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .

2
古いコンパイラー(GCC 5.3)で古いプロジェクトをビルドしているときに、新しいコンパイラー(GCC 7.3)が環境内で提供されていたときにそうしていました。それはうまくビルドして私のマシンで動作しましたが、実行可能ファイルを別のマシンに移動すると、プログラムが要求された5.3ではなくソースの7.3からlibstdc ++。soにリンクされていることに気付きました...
Adam Badura


3

ユーザーが複数のバージョンのコンパイラーを持っている場合、正常にコンパイルされないため、エクスポートは使用するGCC / G ++のバージョンに固有でなければなりません。

 export CC=path_of_gcc/gcc-version
 export CXX=path_of_g++/g++-version
 cmake  path_of_project_contain_CMakeList.txt
 make 

プロジェクトでC ++ 11を使用する場合、これは-std=C++-11CMakeList.txtのフラグを使用して処理できます。


2

代替ソリューションは、クリーンビルドディレクトリから始めて、cmake-guiを介してプロジェクトを構成することです。最初に利用できるオプションの中には、コンパイラへの正確なパスを選択する可能性があります


2

これは、だけcmakeでなく、./configureおよびでも機能しmakeます。

./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++

結果は次のとおりです。

checking for gcc... /usr/local/bin/gcc
checking whether the C compiler works... yes

0

変化する CMAKE_<LANG>_COMPILER再構成をトリガーせずにパスをする

別のコンパイラでコンパイルしたかったのですが、コマンドラインで-Dオプションを渡して、別のコンパイラを設定すると完全に消去されてしまいました。これは、再構成がトリガーされるために発生します。コツは、でコンパイラの検出を無効にしNONE、でパスを設定してFORCEからenable_languageです。

project( sample_project NONE )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" FORCE )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" FORCE )

enable_language( C CXX )

ツールチェーンファイルを使用する

より賢明な選択は、ツールチェーンファイルを作成することです。

set( CMAKE_SYSTEM_NAME Darwin )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" )

次に、追加のフラグでCmakeを呼び出します

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.