2010-04-21 4 views
2

프로젝트를 컴파일하는 동안이 매우 이상한 문제가 있습니다. MOC는 클래스 이름에 moc'ed라는 네임 스페이스를 추가하는 것처럼 보입니다. 비록 파일/클래스의 어느 곳에도 언급되지 않았지만.MOC 클래스 이름에 네임 스페이스 추가

그러나 네임 스페이스는 내가 사용하는 라이브러리에 있지만 헤더 파일에 멀리 떨어져 있으며 UI 파일에는 사용하지 않습니다. 이 MOC가 생성하는 것입니다 :

const QMetaObject SmpTl::CaptureController::staticMetaObject = { 
{ &QObject::staticMetaObject, qt_meta_stringdata_SmpTl__CaptureController, 
    qt_meta_data_SmpTl__CaptureController, 0 }}; 

SmpTl 네임 스페이스가 CaptureController의 선언 어디서나 언급되지 않은,하지만 MOC 생성 된 .cpp 파일에 나타납니다.

저는 Visual Studio와 QT 통합을 사용하고 있습니다.

답변

0

SmpTl은 MOC에서 찾은대로 CaptureController가 정의 된 네임 스페이스입니다.

Q_OBJECT 매크로는 클래스 정의 내부의 staticMetaObject-variable 선언으로 확장됩니다 (특히 확장 될 때까지). MOC 파일에는 해당 변수의 정의가 들어 있습니다.

이것이 올바르지 않으면 Qt 버전과 헤더 파일을 삭제 한 버전을 게시하십시오.

+1

내가 발견 한 문제는, include 목록에서 멀리 떨어져있는 일부 헤더 파일의 asm 코드에서 누락 된 '' '입니다. 코드는 MIPS 아키텍처에서만 # ifdef'ed 였기 때문에 컴파일러는 불평하지 않았습니다. 누락 된 ",하지만 어떻게 든 MOC는 혼란 스러웠다. – Florin

1

이 문제도 발생했습니다. 네임 스페이스 foo는 결코 폐쇄되지 생각에

namespace foo { 
    #ifdef _WIN32 
    ... // This code was fine 
    #else 
    #error Not Supported 
    #endif 
} 

이 혼란 MOC :이처럼 보였다 코드를했다. 분명히 _WIN32가 정의 된 것을 알지 못했고 오류 메시지를 인용 부호로 묶는 것을 잊어 버렸습니다. 변경하면

#error "Not Supported" 

내 문제가 해결되었습니다.

+1

정확히 똑같은 문제에 직면 해 라. 고마워! #error 줄에 작은 따옴표 ''문자가 포함 된 경우에만 추가해야합니다. '''를 제거하거나 에러 문자열을 큰 따옴표로 묶는 것은 나에게 이슈를 수정했다. – Hossein

관련 문제