[解決済み] 単一ファイルのコンパイルフラグをオーバーライドする
質問
私は、プロジェクトをコンパイルするためのフラグのグローバルなセットを使用したいと思います。
ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x )
しかし、サブディレクトリ内の特定のファイル ("foo.cpp" とします) に対して、-Weffc++ (変更できない付属の商用ライブラリ) を適用しないように Weffc++ (変更できない付属の商用ライブラリ) を適用しないように、コンパイル フラグを切り替えたいと思います。 状況を簡素化して-Wallのみを使用するために、私は試してみました。
SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )
という具合に、うまくいきませんでした。 私はまた
SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )
と
ADD_EXECUTABLE( foo foo.cpp )
SET_TARGET_PROPERTIES( foo PROPERTIES COMPILE_FLAGS -Wall )
のように、どちらも機能しませんでした。
最後に、この定義を削除してみました。
REMOVE_DEFINITIONS( -Weffc++ )
ADD_EXECUTABLE( foo foo.cpp )
ADD_DEFINITIONS( -Weffc++ )
これもうまくいきませんでした(つまり、商用ライブラリに関する多くのスタイル警告が表示されます)。 (**注: 実行可能ファイルがビルドされた後、私が -Weffc++ ディレクティブを再インクルードしない場合、警告は抑制されます。)
私はまた、一時的にコンパイル・フラグを削除することを試みました。 http://www.cmake.org/pipermail/cmake/2007-June/014614.html を一時的に削除してみましたが、それでもだめでした。
これに対するエレガントな解決策はないのでしょうか?
どのように解決するのですか?
上記の試みは、あなたが期待しているような上書きではなく、ファイル/ターゲットにさらなるフラグを追加しています。 たとえば、ドキュメントに記載されている ソース ファイルのプロパティ - COMPILE_FLAGS :
これらのフラグは、このソースファイルがビルドされるときに、コンパイルフラグのリストに追加されます。
を打ち消すことができるはずです。
-Weffc++
フラグを打ち消すことができます。
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
これは
-Wno-effc++
の後に
-Weffc++
を指定すると、後者の設定が優先されます。 コマンドの全容を確認し、本当にそうであるかどうかを確認するには、次のようにします。
make VERBOSE=1
余談ですが、GNU C++ 標準ライブラリのメンテナの一人は、このような
-Weffc++
で
この回答
.
もう一つのポイントは、間違った使い方をしていることです。
add_definitions
を、意図したプリプロセッサの定義ではなく、コンパイラのフラグに使っているという意味で、間違って使っているということです。
を使うことが望ましいでしょう。
add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
またはCMakeのバージョン< 3.0では、より似たようなことをするために。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
以下のコメントでのさらなる質問に対して、私は信頼性の高い
を削除する
を確実に削除することは不可能だと思います。 というのも、任意のソース ファイルに対して
COMPILE_OPTIONS
と
COMPILE_FLAGS
1
が適用されますが、これらはそのソース ファイルのどのプロパティにも表示されません。
問題フラグをターゲットの
COMPILE_OPTIONS
から問題フラグを除去し、ターゲットの各ソースに個別に適用して、必要に応じて特定のソース ファイルからそれを省略することを検討できます。
しかし、これは多くのシナリオで機能しますが、2 つの問題があります。
まず
ソース ファイルのプロパティ
を含めないようにします。
COMPILE_OPTIONS
のみです。
COMPILE_FLAGS
. この問題は
COMPILE_OPTIONS
を含むことができるからです。
ジェネレータ式
を含むことができますが
COMPILE_FLAGS
はそれをサポートしていません。 そのため、フラグを検索している間、ジェネレーター式に対応しなければなりませんし、実際、フラグが 1 つ以上のジェネレーター式に含まれている場合、残りのソース ファイルに再適用すべきかどうかを確認するために、ジェネレーター式を "パース" する必要さえあるかもしれません。
第二に - CMake v3.0 以降では、ターゲットは
INTERFACE_COMPILE_OPTIONS
. これは、ターゲットの依存関係が、ターゲットの
COMPILE_OPTIONS
を介して
INTERFACE_COMPILE_OPTIONS
. そのため、さらにターゲットのすべての依存関係を再帰的に反復する必要があります (特に簡単な作業ではありません。
LINK_LIBRARIES
のリストにはジェネレータ式も含まれるため、特に簡単な作業ではありません) を再帰的に調べ、問題フラグを適用しているものを見つけ、それらのターゲットからそれを削除しようとする必要があります。
INTERFACE_COMPILE_OPTIONS
もあります。
この複雑さの段階では、ソースファイルから特定のフラグを無条件に削除する機能を提供するために、CMake にパッチを提出することを検討しています。
1: 注意点として
COMPILE_FLAGS
プロパティとは異なり、ソースファイル上の
COMPILE_FLAGS
プロパティは非推奨です。
関連
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] CMakeの出力をクリアするための'cmake clean'コマンドを探しています。
-
[解決済み] MakefileとCMakeを使ったコンパイルの違いについて
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】CMakeファイルにリンカやコンパイルフラグを追加する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] CMakeでソースファイルを指定する場合、GLOBで指定するのと、1ファイルずつ指定するのと、どちらが良いですか?