003. QMetaObject 관련 에러

Programming/Old 2016. 11. 8. 09:46

Visual Studio로 포팅된 Qt프로젝트는 빌드하다 보면 가끔 아래와 같은 에러가 발생한다.

unresolved external symbol "public: static struct QMetaObject const Project::staticMetaObject" (?....

unresolved external symbol "public: virtual int __thiscall Project::qt_metacall(...

unresolved external symbol "public: virtual struct QMetaObject const* __thiscall Project::metaObject(void)const " (?...

unresolved external symbol "public: virtual void * __thiscall Project::qt_metacast(char const...


qt_static_metacall, qt_metacall, metaObject, qt_metacast에 대한 함수 정의를 못 찾아서 발생하는 에러이다.

이 함수들은 Qt프로젝트 빌드 시 자동으로 생성되는 듯 하다.

해결을 위해서는 Visual Studio의 'Solution Explorer'에서 'Generated Files' 디렉토리를 찾자. 

빌드 모드가 Debug이면 Debug 폴더에서 우측클릭하여 해당 솔루션이 있는 위치에서 역시 Generated Files 폴더를 찾자.

그곳에 보면 해당 에러가 발생한 obj파일 이름이 붙은 cpp파일이 존재한다. 

다시 말하자면, xxx.cpp를 빌드하면 xxx.obj가 생성될테지만, xxx.obj가 Generated Files에서 moc_xxx.cpp를 찾지 못한다면 함수 선언에 매칭되는 정의를 찾지 못해 위와 같은 에러를 발생하는 것이다.

이는 비단 Solution Explorer에 moc_xxx.cpp가 추가 되어 있는데도 발생하곤 한다. 물론 이런 에러가 발생할 때 moc_xxx.cpp는 열리지 않는 경우가 부지기수이니 잘 확인해야 한다. 어어 하다가 괜히 귀찮아져서 길을 되돌아 가는 경우가 생긴다.

수시로 에러가 발생하니 msvc용 Qt는 솔직히 영 미덥지가 못한 게 사실이다.

그래도 Qt Creator로의 빌드 속도와 비교할 때 대~충 2~3배는 더 빠른 것 같으니 어쩔 수 없다. 

admin