Qt 이야기: .cpp 안에서 QObject 자식 클래스 사용하기

Qt 에서 새로운 클래스를 만들 때, 보통은 .h 와 .cpp 를 구분해서 작성한다. 그런데 때로는 .cpp 자체에서 클래스를 만들어 쓰고 싶을 때가 있다. 만약 그 클래스가 QObject 를 상속한 클래스가 아니라면 상관이 없지만, QObject 를 상속하고 Q_OBJECT 를 포함하고 있다면, 링크가 되지 않는다.

예를 들어,

class CppClass : public QObject {
    Q_OBJECT
}; 

CppClass c;

이 경우에, Issues 패널에 다음과 같은 에러 메세지가 나타난다.

In function `ZN8CppClassC1Ev':
undefined reference to `vtable for CppClass'
undefined reference to `vtable for CppClass'
ld returned 1 exit status

이는 .h 의 경우 qmake 가 알아서 처리를 해주지만, .cpp 의 경우 그렇지 않기 때문이다.

이를 해결하려면, qmake 가 .moc 파일을 생성하도록 알려주면 된다. 방법은 간단하다. 필요한 .moc 파일을 .cpp 에 포함시키면 된다.

예를 들어, 위 코드의 파일 이름이 cppclass.cpp 라면, cppclass.moc 파일을 포함시키면 된다. 다만 cppclass.moc 파일은 CppClass 의 선언 이후에 이후에 위치해야 한다. 코드 중간에 위치 하는 것이 마음에 들지 않는다면, 파일의 제일 마지막에 추가하면 된다.

위 코드는 다음과 같이 쓰여져야 한다.

class CppClass : public QObject {
    Q_OBJECT
};

#include "cppclass.moc"

CppClass c;

그런데 이게 끝이 아니다. qmake 에게 알려주어야 한다. 파일을 저장한 후, qmake([Build] - [Run qmake]) 를 실행하면 된다. 이렇게 하지 않으면, cppclass.moc 가 없다며 컴파일되지 않는다.

이제 다시 빌드하면 문제가 발생하지 않을 것이다.



댓글

이 블로그의 인기 게시물

토렌트: < 왕좌의 게임 > 시즌 1 ~ 시즌 8 완결편 마그넷

토렌트: < 스타워즈 > Ep.1 ~ Ep.6 마그넷

토렌트: NGC < 코스모스 > 우리말 더빙 전편(1편~13편) 마그넷