web-dev-qa-db-ja.com

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

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

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

/usr/bin/gcc/usr/local/bin/gccで上書きしようとしましたが、うまくいきません。

92
tidy

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キャッシュから読み取られます。


UPDATE:Jakeのコメントの後にCMAKE_C(XX)_COMPILERをオーバーライドしない理由に関する長い説明

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

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

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

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

キャッシュなし

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はコンパイラーでチェックを実行します。実行可能ファイルを生成できますか?など。また、コンパイラを使用して、arranlibなどの関連ツールを検出します。スクリプトでコンパイラの値をオーバーライドすると、「遅すぎる」ことになり、すべてのチェックと検出が既に行われます。

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

174
Guillaume

この質問は非常に古いものですが、それでも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++ .
16
lambda

CMAKE_C_COMPILERを新しいパスに設定します。

こちらをご覧ください: http://www.cmake.org/Wiki/CMake_Useful_Variables

6
John Zwinck

エクスポートは、使用する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を使用する場合、CMakeList.txtの-std=C++-11フラグを使用してこれを処理できます

3
R.Chatsiri

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

2
Antonio