2016-03-31 3 views
3

プロジェクトでは非常に厳しい警告が使用されていますが、Qt5によって生成されたmocファイルはこれらの警告に違反するコードを生成します。明らかに警告をグローバルにオフにすることはできますが、私はautomocファイルの警告を抑制するだけです。例えばどのようにしてcmakeにautomocファイルのコンパイラ定義を追加するのですか

:以下

In file included from /Users/stebro/client/build/NotificationServer/Notification_automoc.cpp:2: 
/Users/stebro/client/build/NotificationServer/moc_NotificationServer.cpp:100:18: error: dereference of type '_t *' (aka 'void (carbonite::NotificationServer::**)(const QByteArray &, const QString, const QVariant)') that was reinterpret_cast from type 'void **' has undefined behavior [-Werror,-Wundefined-reinterpret-cast] 
      if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&NotificationServer::notificationQueued)) { 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

は動作しません:

set_property(
    DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 
    PROPERTY COMPILE_DEFINITIONS -Wundefined-reinterpret-cast 
) 

cmakeのは文句:

set_property DIRECTORY scope provided but requested directory was not 
    found. This could be because the directory argument was invalid or, it is 
    valid but has not been processed yet. 

私が使用することはできませんSET_PROPERTY(FILEを...) makefileがビルドされた時点でautomocされたファイルの包括的なリストがないので(おそらくGLOBingはwoしませんrkのいずれか)。ビルドによって生成されるすべてのmocファイルのリストを手作業で管理したくはありません。

+0

あなたがこの質問をしたので、あなたはそれを回避する方法を見つけましたか?私は現在、同じ問題を抱えています。 – Corristo

+0

@Corristo:私たちはQt 5.7に移行しました。私たちはもうこの問題を抱えていません(おそらく、Qtのautomocが彼らの行動を取り除いたでしょう)。 clang/OSX環境で実行している場合は、コンパイル行に-I の代わりに-isystem を使用することで、「システム」ヘッダーに対して警告を表示しないようにすることができます。 $ {CMAKE_CURRENT_BINARY_DIR}をシステムパスとしてインクルードするものとして指定することができます。 –

+0

@Corristo:実際には、私はmisspoke(私は私の元の投稿の日付をチェックしました - このコメントは、私の現在のプロジェクトではなく、以前の私のものでした)。私は残念ながら、Qtの悪い動作をカバーするためにすべてのコードに対してグローバル抑制を設定するだけで、この問題を回避しました。下の私の答えを見てください。 –

答えて

1

すべてのAUTOMOC警告を無効にするには、mocコマンドラインで '警告なし'オプションを指定します。 CMAKE_AUTOMOC_MOC_OPTIONSAUTOMOC_MOC_OPTIONSを初期化します。そのドキュメントは以下にリンクされています。

SET(CMAKE_AUTOMOC ON) 
SET(CMAKE_AUTOMOC_MOC_OPTIONS "-nw") 
+0

この行を追加しても、コンパイラの警告は表示されませんでした。私は-nwフラグがコンパイラの警告を制御するとは思わない。上のQtリンクを見てみると、-nwは、ファイルがコンパイルされたときに生成される警告ではなく、mocファイルの世代内の警告を抑制しているようです。 –

+0

@SteveBrobergの基本的な問題は、あなたが警告したい警告を持つファイルをコンパイルしてリンクしていることです。そのためには、automoc.cppをコンパイルするプロジェクトの警告を解除するか、警告を生成しないQtバージョンを使用する以外の方法があるかどうかはわかりません。多分、あなたがmocされた後にファイル内にプラグマを生成するためのスクリプトを書くことができるかもしれませんが、それはたくさんの努力のようです。 –

+0

上記の警告の性質上、Qtのどのバージョンでも、Qtがコールバックを呼び出す方法を示す関数ポインタにvoid *へのポインタをダウンキャストしているので、この警告は表示されません。シグナル/スロットのメカニズム全体をリファクタリングすることには至りませんが、コンパイラ固有のプラグマをコードに入れて無視する以外の方法はありません。 Qtヘッダーは一般的に警告を発しています.Weverythingのためにトリガする警告がたくさんあります。私は8つを抑えなければなりませんでしたが、ヘッダーラッパーを使って管理できます。 –

関連する問題