1. ホーム
  2. c++

[解決済み] 単一ファイルのコンパイルフラグをオーバーライドする

2022-07-16 15:47:26

質問

私は、プロジェクトをコンパイルするためのフラグのグローバルなセットを使用したいと思います。

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 プロパティは非推奨です。