1. ホーム
  2. gcc

[解決済み] CMakeに新しいGCCのパスを指定する方法

2022-04-28 13:10:53

質問

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

しかし cmake の場合、古いバージョンのgccパスが使用されます( /usr/bin/gcc ) . gcc を新しいパス( /usr/local/bin/gcc ).

を上書きしてみました。 /usr/bin/gcc/usr/local/bin/gcc しかし、それは動作しません。

どうすればいいですか?

上書き禁止 CMAKE_C_COMPILER をエクスポートします。 CC (そして CXX ) を呼び出してから、cmake を実行します。

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

エクスポートは一度だけ行えばよく、最初にプロジェクトを設定したときに、それらの値が CMake のキャッシュから読み込まれます。


アップデイト をオーバーライドしない理由を説明します。 CMAKE_C(XX)_COMPILER Jakeのコメント後

を上書きすることはお勧めしません。 CMAKE_C(XX)_COMPILER なぜなら、CMake のキャッシュとうまく連動しないことと、コンパイラのチェックやツールの検出を壊してしまうからです。

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

  • キャッシュなしで、通常の変数を作成します。
  • キャッシュ付き, キャッシュされた変数を作成する。
  • force cache - 設定時に常にキャッシュの値を強制する。

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

キャッシュなし

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

このとき、"normal"変数を作成します。 CMAKE_C(XX)_COMPILER という名前のキャッシュ変数を隠します。つまり、ビルドスクリプトの中でコンパイラがハードコーディングされることになり、カスタム値を与えることができなくなります。これはコンパイラが異なる複数のビルド環境を持っている場合に問題となります。異なるコンパイラを使用するたびにスクリプトを更新すればよいのですが、それではそもそも CMake を使用する価値がなくなってしまいます。

よし、じゃあ、キャッシュを更新しよう...。

キャッシュあり

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

このバージョンはちょうど"not work"になります。このバージョンは CMAKE_C(XX)_COMPILER 変数はすでにキャッシュの中にあるので、強制的に更新しない限り更新されません。

ああ...じゃあフォースを使おう...。

強制キャッシュ

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

これは、quot;normal" 変数バージョンとほとんど同じです。唯一の違いは、あなたの値がキャッシュに設定されるため、ユーザーがそれを見ることができることです。しかし、どのような変更も set コマンドを使用します。

コンパイラのチェックとツールのブレーク

設定プロセスの初期に、CMake はコンパイラのチェックを行います。コンパイラは動作するか?コンパイラは動作するか、実行ファイルを生成できるか、などです。また、コンパイラを使用して、次のような関連ツールを検出します。 arranlib . スクリプトでコンパイラの値を上書きする場合は、すべてのチェックと検出がすでに行われているため、quot;too late"です。

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