[解決済み] CMakeに新しいGCCのパスを指定する方法
質問
私の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 はコンパイラのチェックを行います。コンパイラは動作するか?コンパイラは動作するか、実行ファイルを生成できるか、などです。また、コンパイラを使用して、次のような関連ツールを検出します。
ar
と
ranlib
. スクリプトでコンパイラの値を上書きする場合は、すべてのチェックと検出がすでに行われているため、quot;too late"です。
例えば、私のマシンで gcc をデフォルトのコンパイラとして使っている場合。
set
コマンドを
/usr/bin/clang
,
ar
が設定されます。
/usr/bin/gcc-ar-7
. CMake を実行する前にエクスポートを使用する場合は、次のように設定されます。
/usr/lib/llvm-3.8/bin/llvm-ar
.
関連
-
[解決済み] g++ 出力: ファイルが認識されません。ファイル形式が認識されない
-
gccコンパイルオプション -fpermissive
-
[解決済み] OSX 10.9にXcodeをインストール - clang: エラー: 入力ファイルがありません。
-
[解決済み] LD_LIBRARY_PATH と LIBRARY_PATH の比較
-
[解決済み] cygwinにgccをインストールするにはどうしたらいいですか?
-
[解決済み] CMakeの出力をクリアするための'cmake clean'コマンドを探しています。
-
[解決済み] なぜGCCは、速度の代わりにサイズに最適化すると、15-20%速いコードを生成するのですか?
-
[解決済み】CMakeでC++ 11を有効にするには?
-
[解決済み】すべてのgcc警告を無効にする
-
[解決済み】-Wl,-rpath -Wlがわかりません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] gcc エラー : `itoa' への未定義の参照
-
[解決済み] gcc/g++とcc1/cc1plusの違いは何ですか?
-
[解決済み] .ascizと.stringアセンブラディレクティブの違いは何ですか?
-
[解決済み] 警告: 異なるサイズの整数への/からのポインタへのキャスト
-
[解決済み] 自作のmakefileを作成する【エラー255】。
-
[解決済み] シグナル11[SIGSEGV]のデフォルトアクションでプロセスが終了しています。
-
[解決済み] ビルドターゲットの外にgccのデバッグシンボルを生成する方法は?
-
[解決済み] どのフラグが -march=native で有効になるかを確認する方法は?
-
[解決済み] ライブラリヘッダからのGCC警告を抑制する方法は?