2013-07-06 7 views
3

취미 프로젝트 애플리케이션 (사전 검색 프로그램)을 플러그인 아키텍처로 전환하여 향후 다른 언어 용으로 모든 종류의 사전을 개발할 수 있도록했습니다. 이 응용 프로그램은 Visual C++에서 Qt (5.0.2)로 개발되었습니다. 나는 사전 플러그인에 대한 인터페이스를 정의하기 위해 응용 프로그램 코드에이 헤더를 추가 :Qt 애플리케이션을 확장하기위한 플러그인 빌드하기

// 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 

다음, 나는 Qt는 비주얼 스튜디오 애드온을 사용하여 플러그인 자체에 대한 "Qt는 라이브러리"템플릿에서 새 프로젝트를 (생성 에서 dll을 만드는 데 사용됩니다. 주요 헤더 파일은 다음과 같습니다

3 :이 빌드 할 때

#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에서 오류가 발생합니다 > ------ 빌드 시작 : 프로젝트 : jp_plugin, 구성 : Debug Win32 ------
3> Moc'ing jp_plugin.h ...
3> F : \ moje \ src \ cpp \ winona \ build \ jp_plugin \ jp_plugin.h (15) : 오류 : 정의되지 않은 인터페이스
========== 빌드 : 2 개 성공, 1 개 실패, 2 개 최신 e, 0 건너 뛰기 ==========

dict_plugin.h 파일이 포함되기 전에 moc'ing이 실행되는 것처럼 보입니다. 왜냐하면 내가 포함 파일 이름에 오타를 삽입했을 때, 파일이 존재하지 않는다고 불평하지 않고 정의되지 않은 인터페이스에 대한 동일한 오류 메시지로 빌드를 종료합니다.

내가 뭘 잘못하고 있니? 감사.

+0

'#include "dict_plugin.h"'가 아니어야합니까? '<>'헤더는 시스템 헤더입니다. 자신의 헤더가''''에 포함됩니다. – MSalters

+0

아니요. dict_plugin 헤더가 애플리케이션에 속하고 모든 플러그인이 자체 헤더가 아닌 외부 헤더로 포함되기 때문입니다. 게다가, 저는 전처리 기가 어쨌든 요즘에는 모든 헤더에 똑같이 작동하는 것 같지 않습니다. – neuviemeporte

+0

요점을 놓치고 있습니다. MOC는 헤더도 포함해야하며, * IT *는 헤더를 건너 뜁니다. 컴파일러의 전 처리기가 아닙니다. – MSalters

답변

5

moc가 실패한 이유는 인터페이스 선언을 사용할 수 없었기 때문입니다. 파일을 찾을 수 없기 때문에 #include 지시어가 실패했습니다. 분명히 moc은 #include 지시문을 단독으로 처리 할 수 ​​있지만 기본적으로 포함하지 않을 파일을 찾지 못하면 오류 메시지를 인쇄하거나 처리를 중단합니다.

인터페이스 선언이있는 헤더 파일을 찾을 수없는 이유는 Qt VS 추가 기능에서 생성 된 moc가 호출되도록하는 사용자 정의 빌드 설정이 프로젝트의 포함 경로를 상속받지 않기 때문입니다. 필자는 플러그인 헤더 파일의 속성 페이지를 입력하고 Custom Build Tool-> General-> Command Line을 탐색하고 추가 "-I ..."include 옵션을 추가하여 moc의 명령 행에 필수 경로를 수동으로 추가 할 수있었습니다. 종료. 그 후, moc가 헤더를 처리하고 빌드가 성공했습니다.

+0

같은 오류, 같은 수정. 감사! – Tobias

+0

... 그리고 그게 오늘 고칠 수있었습니다 :-) 고마워요! – Arun

+0

내 경우에는 moc가 <>를 통해 연결된 파일을 보지 못했습니다.대체에 "..."이 문제를 해결했습니다. – Francuz