3

私は趣味のプロジェクト アプリケーション (辞書検索プログラム) をプラグイン アーキテクチャに切り替えて、将来的に他の言語用にあらゆる種類の辞書を開発できるようにすることにしました。アプリケーションは、Qt (5.0.2) を使用して Visual C++ で開発されています。このヘッダーをアプリケーション コードに追加して、辞書プラグインのインターフェイスを定義しました。

// dict_plugin.h
#ifndef DICT_PLUGIN_H
#define DICT_PLUGIN_H

#include <QtPlugin>

class PluginInterface
{
public:
    virtual ~PluginInterface() {}

    virtual QString language() const = 0;
    virtual class QWidget* ui() const = 0;
};

Q_DECLARE_INTERFACE(PluginInterface, "pl.ksmvision.winona.PluginInterface")

#endif // DICT_PLUGIN_H

次に、dll の作成に使用されるプラグイン自体 (Qt Visual Studio アドインを使用) の「Qt ライブラリ」テンプレートから新しいプロジェクトを作成しました。メイン ヘッダー ファイルは次のようになります。

#ifndef JP_PLUGIN_H
#define JP_PLUGIN_H

// created by the template to define Q_DECL_EXPORT 
// and _IMPORT macros but the plugin engine takes 
// care of that (I think)
//#include "jp_plugin_global.h"

#include <QObject>
#include <QtPlugin>

#include <dict_plugin.h>

class JpPlugin : public QObject, public PluginInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "pl.ksmvision.winona.JpPlugin")
    Q_INTERFACES(PluginInterface)

public:
    JpPlugin();
    virtual ~JpPlugin();

    virtual QString language() const;
    virtual QWidget* ui() const;
};

#endif // JP_PLUGIN_H

これをビルドしようとすると、プラグインが実装するはずのインターフェイスを指定する Q_INTERFACES 行の moc からエラーが発生します。

3>------ ビルド開始: プロジェクト: jp_plugin, 設定: Win32 をデバッグ ------
3> jp_plugin.h を Moc'ing...
3>F:\moje\src\cpp\winona\build \jp_plugin\jp_plugin.h(15): error : Undefined interface
========== ビルド: 2件成功、1件失敗、2件更新、0件スキップ ========= =

dict_plugin.h ファイルがインクルードされる前に moc'ing が行われるように見えます。これは、インクルード ファイル名にタイプミスを導入すると、ファイルが存在しないことを訴えず、同じエラー メッセージでビルドを終了するだけだからです。インターフェイスが未定義であることについて。

私は何を間違っていますか?ありがとう。

4

1 に答える 1

6

moc が失敗した理由は、インターフェイス宣言が利用できなかったためです。ファイルが見つからなかったため、#include ディレクティブが失敗しました。どうやら、moc は #include ディレクティブを単独で処理できますが、(デフォルトでは?) エラー メッセージを出力したり、インクルードするファイルが見つからない場合に処理を停止したりしません。

インターフェイス宣言を含むヘッダー ファイルが見つからなかった理由は、Qt VS アドインによって生成された moc を呼び出すカスタム ビルド設定が、プロジェクトのインクルード パスを継承していないためです。プラグインのヘッダー ファイルのプロパティ ページを入力し、[カスタム ビルド ツール] -> [一般] -> [コマンド ライン] を参照して、追加の "-I..." インクルード オプションを終わり。その後、moc でヘッダを処理し、ビルドに成功しました。

于 2013-07-06T15:59:07.723 に答える