2010-11-22 5 views
4

My Qtプロジェクトは、Linux専用のライブラリにリンクしています。プロジェクトがlinuxで実行されている場合、そのライブラリで定義されている型を使用してイベントでシグナルを発生させたいと考えています。しかし、私が持っている複雑なことは、プロジェクトもWindowsで構築する必要があるということです。明らかに、このシグナルとそれを捕まえるスロットはWindowsでは存在しません。それは問題ありません。しかし、私はQtのmocツールが信号を発信するコードの周りに#ifdef __linux__の存在を認識できないという問題を発見しています。私は、G ++でこれをコンパイルしようとするとifdefで包まれたQtシグナル

[SomeFile.h]

#ifdef __linux__ 
signals: 
    void SomeSignal(SomeTypeDefinedInTheLinuxLibrary); 
#endif 

[SomeFile.cpp]

#ifdef __linux__ 
    emit SomeSignal(someObject); 
#endif 

、私はエラーを取得: SomeFile.cpp:(.text+0x858c): undefined reference to SomeFile::SomeSignal(SomeTypeDefinedInTheLinuxLibrary)私のコードは次のようになります

どのようにmocと#ifdefsをうまく組み合わせるにはどうすればいいですか?

答えて

5

もっと良い解決策は、常に信号を提供し、Windowsでを起動するコードをコメントアウトすることです。そうすれば、パブリックAPIはすべてのプラットフォームで同じです。

[編集] mocツールは本当にダムです。実際にコードを理解するわけではありません。代わりに、特定のパターンに反応します。そのため、#ifdefは無視されます。

問題を解決するには、タイプをラップするか、または#ifndef __linux__を使用し、独自のダミータイプを定義してWindowsでコンパイルします。 Windows上ではシグナルが出力されないため、スロットは決して使用されないので、コードをコンパイルするどのタイプでも問題ありません。

+0

私はそれを行うことができますが、信号に関連するパラメータのタイプはLinux固有のライブラリによって定義されています。コメントアウトされていない信号でウィンドウを構築しようとすると、定義されていないタイプのエラーになります。 –

+0

@Dave:タイプをラップするか、 '#ifndef __linux__'を使用してそこに独自のダミータイプを定義し、Windows上でコンパイルします。 –

+0

入力いただきありがとうございます。私はタイプをラップして終了し、それを動作させました。それでも、mocによって生成されたコードは、シグナル/スロットコードがある#ifdefsを尊重する必要があります。 –

0

Qt 5.3では、少なくともVisual Studioを使用して、プリプロセッサマクロをmocツールに渡すことができます。この作業を行うために、Visual Studioプロジェクトファイルをテキスト編集し、プリプロセッサの引数をmocツールに渡すために各ファイルのコマンドライン引数を手動で追加する必要がありました。 -D [プリプロセッサ]、つまり-DSPECIAL_BUILDまたは-DSPECIAL_BUILD = 1を使用することができます。mocコンパイラは#if SPECIAL_BUILDチェックをコード内で確認し、それらの部品をモックしようとしません。

「moc.exe」を検索し、各設定に適切なパラメータを追加するだけです。

関連する問題