3

ビルドで CMake を使用しています。次のようなコンパイラフラグを設定しようとしています:

set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")

ただし、コンパイラ フラグの 1 つが設定されていないため、ビルドが失敗します。

CMake-GUI の変数の値が空であることを確認すると、次のようになります。

ここに画像の説明を入力

誰かが何が起こっているのか指摘できますか?

4

1 に答える 1

4

cmake-gui で表示されるのは、キャッシュ ステータスです。明示的にキャッシュした変数、または定義済みの cmake キャッシュ変数のみが表示されます。

今、あなたがするとき:

set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")

あなたは何か特別なことをしています.定義済みのcmakeキャッシュ変数と同じ名前を持つ「ローカル」(キャッシュされていない)変数を設定しています. C++ では、グローバル変数と同じ名前でローカル変数を定義するようなものです。ローカル変数はグローバル変数を隠します。

setドキュメントから。(ドキュメントでは、私が「ローカル」と呼んでいるものを「通常」と呼んでいます)

両方のタイプが同じ名前で異なる値で同時に存在できます。${FOO} が評価されると、CMake はまずスコープ内で通常の変数 'FOO' を探し、設定されている場合はそれを使用します。通常の変数が存在しない場合にのみ、キャッシュ変数「FOO」にフォールバックします。

既に効果的に CMAKE_C_FLAGS_DEBUG を設定しており、コンパイラは指定したフラグを使用します。次の方法で確認できます。

message(STATUS "CMAKE_C_FLAGS_DEBUG = ${CMAKE_C_FLAGS_DEBUG}")

つまり、あなたの建物は別の理由で失敗しています。make がどのコマンド ラインを生成するかを確認します: make VERBOSE=1.

ちなみに、次のようにして、定義済みのフラグにフラグを追加することをお勧めします。

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -option1 -option2 -option3")

CMAKE_C_FLAGSこれらの設定をすべてのビルド タイプに適用する場合は、他の定義済み変数の使用も検討してください。


編集:いくつかの反復の後、問題はビルドタイプ( )がcmakeから設定されていない
ことであることが判明しました。CMAKE_BUILD_TYPEこれは、cmake-gui インターフェイスを介して行うか、または cmake コマンド ラインに何かを追加することで実行でき-DCMAKE_BUILD_TYPE=Debugます-DCMAKE_BUILD_TYPE=Release

于 2015-04-19T21:36:08.753 に答える