6

私の Qt プロジェクトは、Linux 専用のライブラリにリンクしています。プロジェクトが Linux で実行されている場合、そのライブラリで定義されたタイプを使用して、イベントでシグナルを発生させたいと考えています。ただし、複雑なのは、プロジェクトも Windows でビルドする必要があることです。明らかに、このシグナルとそれをキャッチするスロットは Windows には存在しませんが、それで問題ありません。ただし、Qt の moc ツール#ifdef __linux__がシグナルを発するコードの周りに存在することを認識できないという問題を見つけています。私のコードは次のようになります。

[SomeFile.h]

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

[サムファイル.cpp]

#ifdef __linux__
  emit SomeSignal(someObject);
#endif

これを g++ でコンパイルしようとすると、次のエラーが発生します。 SomeFile.cpp:(.text+0x858c): undefined reference to SomeFile::SomeSignal(SomeTypeDefinedInTheLinuxLibrary)

moc と #ifdefs をうまく連携させる方法はありますか?

4

2 に答える 2

6

はるかに優れた解決策は、常にシグナルを提供し、Windowsでそれを起動するコードをコメント アウトすることです。これにより、パブリック API はすべてのプラットフォームで同じになります。

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

この問題を解決するには、型をラップするか#ifndef __linux__、そこに独自のダミー型を使用して定義し、Windows でコンパイルできるようにします。シグナルは Windows では発行されないため、スロットは使用されないため、コードをコンパイルする任意の型で問題ありません。

于 2010-11-22T14:43:55.167 に答える