回答:
上書きせず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)_COMPILER
2つの主な理由で値を上書きしないことをお勧めします。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をデフォルトのコンパイラとして使用しているマシンでは、set
toコマンドを使用すると/usr/bin/clang
、ar
に設定され/usr/bin/gcc-ar-7
ます。CMakeを実行する前にエクスポートを使用すると、エクスポートはに設定され/usr/lib/llvm-3.8/bin/llvm-ar
ます。
which gcc
> export CXX =which g++
export CC=`which gcc` export CXX=`which g++`
Incorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
CMAKE_C_COMPILER
、コマンドラインを使用して設定すれば、設定はうまく機能します$ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source
。
この質問はかなり古いですが、それでも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++ .
セットする CMAKE_C_COMPILER
新しいパスにします。
ここを参照してください:http : //www.cmake.org/Wiki/CMake_Useful_Variables
ユーザーが複数のバージョンのコンパイラーを持っている場合、正常にコンパイルされないため、エクスポートは使用する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++-11
CMakeList.txtのフラグを使用して処理できます。
これは、だけ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
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 ...
/opt
ではなくに代替のgccバージョンをインストールすることをお勧めし/usr/local
ます。できれば/opt/gcc-x.y.z
。これにより、さらに新しいバージョンが必要になった場合でも、以前のバージョンをアンインストールするのに問題はありません。