undefined reference to 'vtable for...'


이런 에러가 뜨는 경우 두 가지를 먼저 살펴보시면 문제 해결을 빨리 할 수도 있습니다.


1. virtual 키워드 사용한 곳 찾기

 - 구현을 강제하려고 순수 가상 함수로 만들어 놓은 인터페이스가 있다면,

 1.1. 해당 인터페이스를 구현 하였는지

 1.2 순수 가상 함수가 아니라 virtual 키워드만 추가한 것은 아닌지

   - 참고: 순수 가상함수 원형

     virtual void slotPendingProcess() = 0;

     virtual void slotPendingProcess() { } // 이렇게 해도 무방


2. QT에서는 목적 파일(*.o) 외에 QT에서 제공하는 특수한

moc_*.o/moc_*.cpp (Meta-object compiler) 파일이 생성됩니다.


자세한 내용은 http://doc.qt.io/qt-5/moc.html 이 곳과

https://kldp.org/node/123913 의 답변을 참고해주세요.


의심 되는 부분을 수정 하였음에도 (항목 1이나 그 외 문법상 이상이 없다고 판단)

에러가 나는 경우에는 위에서 언급한 moc_*.o/moc_*.cpp 파일을 의심해 봐야합니다.

위 파일은 컴파일 단계에서 갱신이 안되거나, (F5를 통해 실행하려고 할 때)

파일 이름이나 클래스 이름이 바뀌었는데 moc 가 갱신이 안되었거나 하기도 합니다.


이런 경우 Makefile 를 갱신해 주어야 하는데요,

qt에서는 Makefile을 직접 작성하지 않죠, qmake 를 한 번 해주고

클린 빌드를 통해서 이를 해결 할 수 있습니다.


'QT' 카테고리의 다른 글

5.10.1 static build error  (2) 2018.03.23
버전 정보 넣기  (0) 2016.09.26
반투명 그릴 때 배경 잔상 문제  (0) 2016.05.11
libwinpthread 가 계속 동적 빌드만 될 때  (0) 2016.04.28
디버깅 매크로  (0) 2016.04.19
Posted by 독뽀
,

안드로이드에서 파티션 정보를 보려고 하니 커널 메세지(dmesg)에서는 확인이 불가하였습니다.

mount 나 busybox df -h 로는 마운트 정보만 나오기 때문에 이 또한 무용지물이라 찾아보던 중..


/proc 폴더에는 여러 유용한 정보들이 숨어 있죠,

안드로이드에서는 /proc/partitions 에 파티션 정보가 있었습니다.


다만 한가지, 제가 쓰는 보드 특성인지 모르겠지만 시리얼 로그에서 보이는 파티션 정보에서는

partition count: 12 라고 떴지만 아래에 나오는 파티션은 총 14개가 나왔습니다.


계산을 해보니 첫 번째 필드는 전체 합으로 확인이 되었습니다. (딱 떨어지지는 않습니다. 159 KB 가 빔)

따라서 첫 번쨰 ndda 와 1블럭짜리 ndda4 를 빼면 총 12개라고 확인하면 될것 같습니다.

(제가 파티션을 나눌 때 1KB 짜리는 나눈 적이 없거든요)


참고로 아래 나온 blocks 는 KB 단위를 표시하는 것으로 확인이 됩니다.

파티션 나눌 때 ndda1~ndda12 까지는 제가 딱 저 값들을 입력 하였습니다.

(ndda13 은 나머지 공간이 자동으로 잡히게 됨)


# cat /proc/partitions

major minor  #blocks  name


 240        0    4037632 ndda

 240        1      15360 ndda1

 240        2     665600 ndda2

 240        3    1048576 ndda3

 240        4          1 ndda4

 240        5     153600 ndda5

 240        6      15360 ndda6

 240        7      20480 ndda7

 240        8      20480 ndda8

 240        9      20480 ndda9

 240       10      20480 ndda10

 240       11     524288 ndda11

 240       12    1048576 ndda12

 240       13     484192 ndda13

'Android' 카테고리의 다른 글

app 재실행 하기  (0) 2013.10.24
빨간 테두리 나오는 현상  (0) 2013.10.23
Ethernet 사용을 위한 Kernel 설정  (0) 2013.08.07
Android 빌드 시스템 (Make file 관련)  (0) 2013.08.05
System app 구분  (0) 2013.08.05
Posted by 독뽀
,

환경: QtCreator3.4.2 / mingw4.9.2 / Qt 4.8.6 static


반투명 배경을 가진 글자가 흐르는 자막 기능이 필요해서 구현 해 보았습니다.


간단히 쓰려는 글자의 크기를 알아내어 (QFontMetrics 참조)

그 크기에 맞게 QPixmap (mBuffer) 을 하나 생성해서


mBuffer = QPixmap(QFontMetrics(mFont).boundingRect(message).width() + 14, height()); // 14는 여백


QPainter를 이용해 글자를 쓰고,

QPainter painter(&mBuffer);

if (painter.isActive()) {

    painter.end();

}

painter.begin(&mBuffer);

painter.setFont(mFont);

painter.setRenderHint(QPainter::Antialiasing);


QRect bufferRect = mBuffer.rect();

painter.setPen(mTextColor);

painter.setBrush(Qt::NoBrush);


bufferRect.setY(bufferRect.y() + 20);

painter.drawText(bufferRect, Qt::AlignCenter, msg);

painter.end();

raise();

show();


startCaptionThread();  // 쓰레드 호출


QThread (혹은 QTimer) 등을 이용해서 그릴 위치인 QPoint 좌표의 x축만 이동 시킨 후 update() 를 호출하고,

const int textWidth = mBuffer.width();

if (-textWidth < mPos.x()) {

    mPos.setX(mPos.x() - 1);

    update();

} else {

    // 자막이 화면에서 완전히 사라진 상태, 자막 초기화

}


paintEvent 에서는 글자가 써진 QPixmap 을 그릴 위치인 QPoint 좌표대로 그리기만 합니다.

QPainter p(this);

if (p.isActive()) {

    p.end();

}

p.begin(this);

QRect r = mBuffer.rect();

r.setX(mPos.x());

p.drawPixmap(r.x(), r.y(), mBuffer);


p.end();


그런데 자막이 화면에서 사라지기 전에 자막을 다시 그리도록 재시작을 했더니

자막 배경에 이전에 보이던 글자들의 잔상이 남아있었습니다.


해결 방법은 간단했습니다.


QPixmap 에 글자를 쓰기 직전에 QPixmap 을 fill 메서드를 통해 투명으로 칠해 주었더니 해결되었습니다.

mBuffer.fill(Qt::transparent);


'QT' 카테고리의 다른 글

버전 정보 넣기  (0) 2016.09.26
undefined reference to 'vtable for...'  (0) 2016.05.19
libwinpthread 가 계속 동적 빌드만 될 때  (0) 2016.04.28
디버깅 매크로  (0) 2016.04.19
QByteArray 의 reserve() vs resize()  (0) 2016.03.18
Posted by 독뽀
,