2009-12-08 40 views
93

私はlog4cxx、boostなどのライブラリを使用しており、ヘッダが(反復的な)警告をたくさん生成しています。ライブラリのインクルードからの警告を抑制する方法はありますか(#include < some-header.h >)、または特定のパスからインクルードしていますか?私は関連する情報が不明瞭でなくても、プロジェクトコードに-Wallや-Wextraをいつものように使用したいと思います。私は現在、出力を行う際にgrepを使用していますが、何か改善が必要です。ライブラリヘッダーからのGCC警告を抑制する方法は?

答えて

95

-Iの代わりに-isystemを使用してライブラリヘッダーを含めることをお勧めします。これはそれらを "システムヘッダー"にし、GCCは警告を報告しません。

+9

これをXCodeで行う場合は、ターゲットビルド設定の「カスタムコンパイラフラグ」内の「他のC++フラグ」にシステムパスをスティックします。 –

+2

潜在的な欠点は、いくつかのプラットフォームでg ++が自動的にシステムヘッダを 'extern" C "'にラップし、 '-isystem'パスにC++ヘッダーを' #includeすると、Cリンケージに関する奇妙なエラーが発生します。 –

+0

+1は私に迷惑なブースト警告の問題を解決するのに役立ちましたhttp://stackoverflow.com/questions/35704753/warnings-from-boost – mrgloom

4

precompiled headersを試すことができます。警告は消えませんが、少なくともあなたのメインコンパイルには表示されません。

+1

これは実際には良い考えです。サードパーティのインクルードは毎日変更されません。 – AdSR

+0

正確です。私はそれをLinuxであまり使っていませんが、Visual Studioでうまく動作します。 –

8

#pragmaは、コンパイラへの指示です。 #includeの前に何かを設定して後で無効にすることができます。

command lineでも行うことができます。

具体的にはdisabling warningsの別のGCCページ。

私は、ソースコード内の#pragmaのを使用して、その後、あなたが警告を無効にしている理由の(コメントなど) 理由を提供するオプションのために行くだろう。これはヘッダーファイルについての推論を意味します。

GCCがこれに接近します。警告タイプはclassifyingです。あなたはそれらを警告または無視されるように分類できます。以前にリンクされた記事は、どの警告が無効になっているかを示します。

注:attributesを使用して特定の警告を防ぐために、ソースコードをマッサージすることもできます。しかし、これはGCCと非常に密接に結びついています。

注2:GCCでもmicrosoftのコンパイラで使用されているようにpop/push interfaceが使用されています。このインターフェイスでは、警告が無効になります。私はそれが可能かどうかわからないので、これをさらに調査することをお勧めします。

+0

プラグマを考慮しましたが、ヘッダを含める前に警告を表示しない場合は、#includeの後に*以前の状態に戻すにはどうしたらいいですか?私はプロジェクトコードの警告を見たい(私はすでに数回は助けてくれた)が、コマンドラインから制御したい。 – AdSR

+0

が追加されました。 –

-6

これらの警告の理由が必要です。これらは、ライブラリを使用するコードのエラー、またはライブラリコード自体のエラーによって引き起こされます。最初のケースでは、コードを修正してください。 2番目のケースでは、ライブラリの使用を中止するか、またはFOSSコードであればそれを修正します。

+0

+1良いアドバイスのために:Dしかし、彼は特定の何かをする方法を尋ねています:D –

+3

特にサードパーティのコードでは、* Boostのようなメタプログラミング豊富なコードで、いくつかの警告は不可能か非常に難しいです。 – ulidtko

+3

私に迷惑をかけているものが悪い* "'c'の宣言は、この '[-Werror = shadow]' *のメンバをいくつかのブーストヘッダに深く深く刻んでいます。それは確かに問題ではありませんが、それと同様の問題が出力を吐き出しており、私たちがコードベースでインスタンスを実際にシャドーイングするのを困難にしています。 – dmckee

23

私はこのトリックを見つけました。ライブラリの場合は、-Idirの代わりに-isystem dirをmakefileに使用してください。 GCCはシステムが含むようにブーストなどを処理し、それらからの警告を無視します。

34

プラグマを使用できます。たとえば:CMakeのを使用してそれらのために

// save diagnostic state 
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall" 
#pragma GCC diagnostic ignored "-Wunused-but-set-variable" 

#include <boost/uuid/uuid.hpp> 
#include <boost/uuid/uuid_generators.hpp> 
#include <boost/uuid/uuid_io.hpp> 
#include <boost/lexical_cast.hpp> 

// turn the warnings back on 
#pragma GCC diagnostic pop 
+1

GCC> = 4.6でのみ利用可能 – Caduchon

66

、あなたはそのようなヘッダに対する警告を抑制し、シンボルSYSTEMを含めるようにinclude_directoriesディレクティブを変更することができます。

include_directories(SYSTEM "${LIB_DIR}/Include") 
        ^^^^^^ 
+0

ライブラリがCMakeの[include()](https://cmake.org/cmake/help/latest/command)で使用する '$ {LIBFOO_USE_FILE} /include.html)コマンド? – waldyrious

+2

これは私の問題のほとんどの解決策であるようです。私は1)を持っています。バイナリターゲットは、2)ヘッダーのみのターゲット、3)外部ライブラリに依存しています。私は1&2の警告だけを受ける方法は知らない。アイデアはありますか? – knedlsepp

+0

動作していないようです。私は 'easylogging ++'を使ったプロジェクトでこれを試しました。 'easylogging ++。h 'からの警告は、' SYSTEM'オプションに含まれていたとしても同じです。 – rbaleksandar

0

システムヘッダを明示的に上書きする必要がある場合は、プラグマに制限されます。 make depend出力経由で使用しているものを確認できます。

も参照してください。diagnostic push-pop for gcc >= 4.6

関連する問題