[해결] qt에서의 include 문제.

bus710의 이미지

오늘은 qt를 보고 있었습니다.

교재는 서영진님의 '그 책' 입니다.

소스를 보면서 천천히 따라 해보고 있다가 문득 막힌 부분이 include하는 부분이었습니다.

책에서는 #include "QApplication" 이라고 되어 있습니다.

에러가 나기에 이리저리 바꿔 보다가 #include "qapplication.h"로 선언해 주었습니다.

대문자를 소문자로 바꾸어 주고, .h를 붙여주니 잘 찾습니다.

qt-4.3.3 입니다. 아마도 라이브러리들이 어떻게 이름 붙여져 있느냐에 따라 다른 것 같습니다.

제 추측은 이렇습니다. 호환성을 위해 QApplication 이라고 해놓고 링크를 통해 qapplication.h 를 찾는게 아닌가 하는 거죠..

혹시 이와 관련해 확실하게 알려 주실 분 안계신가요?????????

bushi의 이미지

fedora8 입니다.

[bushi@rose net]$ 
[bushi@rose net]$ cat q.cpp
#include <QApplication>
[bushi@rose net]$ 

QtGui

[bushi@rose net]$ strace -f g++ q.cpp `pkg-config --cflags --libs QtGui` 2>&1 | grep -i qapplication
[pid 32702] read(4, "#include <QApplication>\n", 24) = 24
[pid 32702] stat64("/usr/include/QtGui/QApplication.gch", 0xbf98c7d0) = -1 ENOENT (No such file or directory)
[pid 32702] open("/usr/include/QtGui/QApplication", O_RDONLY|O_NOCTTY) = 5
[pid 32702] read(5, "#include \"qapplication.h\"\n", 26) = 26
[pid 32702] stat64("/usr/include/QtGui/qapplication.h.gch", 0xbf98c7d0) = -1 ENOENT (No such file or directory)
[pid 32702] open("/usr/include/QtGui/qapplication.h", O_RDONLY|O_NOCTTY) = 5
[bushi@rose net]$ 

Qt

[bushi@rose net]$ strace -f g++ q.cpp `pkg-config --cflags --libs Qt` 2>&1 | grep -i qapplication
[pid 32717] read(4, "#include <QApplication>\n", 24) = 24
[pid 32717] stat64("/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/QApplication.gch", 0xbf916fc0) = -1 ENOENT (No such file or directory)
[pid 32717] open("/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/QApplication", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
[pid 32717] stat64("/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/i386-redhat-linux/QApplication.gch", 0xbf916fc0) = -1 ENOENT (No such file or directory)
[pid 32717] open("/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/i386-redhat-linux/QApplication", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
[pid 32717] stat64("/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/backward/QApplication.gch", 0xbf916fc0) = -1 ENOENT (No such file or directory)
[pid 32717] open("/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/backward/QApplication", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
[pid 32717] stat64("/usr/local/include/QApplication.gch", 0xbf916fc0) = -1 ENOENT (No such file or directory)
[pid 32717] open("/usr/local/include/QApplication", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
[pid 32717] stat64("/usr/lib/gcc/i386-redhat-linux/4.1.2/include/QApplication.gch", 0xbf916fc0) = -1 ENOENT (No such file or directory)
[pid 32717] open("/usr/lib/gcc/i386-redhat-linux/4.1.2/include/QApplication", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
[pid 32717] stat64("/usr/include/QApplication.gch", 0xbf916fc0) = -1 ENOENT (No such file or directory)
[pid 32717] open("/usr/include/QApplication", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
[pid 32717] write(2, "QApplication: \352\267\270\353\237\260 \355\214\214\354\235\274\354\235\264\353\202"..., 56QApplication: 그런 파일이나 디렉토리가 없음) = 56
[bushi@rose net]$ 

[bushi@rose net]$ rpm -qf /usr/lib/pkgconfig/Qt.pc 
qt4-devel-4.3.5-1.fc8
[bushi@rose net]$ rpm -qf /usr/lib/pkgconfig/QtGui.pc 
qt4-devel-4.3.5-1.fc8

[bushi@rose net]$ pkg-config --cflags --libs QtGui
-DQT_SHARED -I/usr/include/QtGui  -L/usr/X11R6/lib -lQtGui -lQtCore  
[bushi@rose net]$ 

[bushi@rose net]$ rpm -qf /usr/include/QtGui/QApplication 
qt4-devel-4.3.5-1.fc8
[bushi@rose net]$

[bushi@rose net]$ ls -l /usr/lib/pkgconfig/Qt*
-rw-r--r-- 1 root root 366 2008-06-05 04:21 /usr/lib/pkgconfig/Qt.pc
-rw-r--r-- 1 root root 823 2008-06-05 04:21 /usr/lib/pkgconfig/Qt3Support.pc
-rw-r--r-- 1 root root 664 2008-06-05 04:21 /usr/lib/pkgconfig/QtAssistantClient.pc
-rw-r--r-- 1 root root 734 2008-06-05 04:21 /usr/lib/pkgconfig/QtCore.pc
-rw-r--r-- 1 root root 640 2008-06-05 04:21 /usr/lib/pkgconfig/QtDBus.pc
-rw-r--r-- 1 root root 800 2008-06-05 04:21 /usr/lib/pkgconfig/QtGui.pc
-rw-r--r-- 1 root root 766 2008-06-05 04:21 /usr/lib/pkgconfig/QtNetwork.pc
-rw-r--r-- 1 root root 840 2008-06-05 04:21 /usr/lib/pkgconfig/QtOpenGL.pc
-rw-r--r-- 1 root root 762 2008-06-05 04:21 /usr/lib/pkgconfig/QtScript.pc
-rw-r--r-- 1 root root 750 2008-06-05 04:21 /usr/lib/pkgconfig/QtSql.pc
-rw-r--r-- 1 root root 783 2008-06-05 04:21 /usr/lib/pkgconfig/QtSvg.pc
-rw-r--r-- 1 root root 622 2008-06-05 04:21 /usr/lib/pkgconfig/QtTest.pc
-rw-r--r-- 1 root root 610 2008-06-05 04:21 /usr/lib/pkgconfig/QtUiTools.pc
-rw-r--r-- 1 root root 750 2008-06-05 04:21 /usr/lib/pkgconfig/QtXml.pc
[bushi@rose net]$ 

OTL
bus710의 이미지

제가 좀 더 정확한 정보를 드렸어야 했는데...!
다시금 확인해 보니 어쩐지 qt3 만 깔려 있는 것 같습니다.

왜 그렇게 생각했냐하면.... /usr/qt/에 3이라는 디렉토리만 있었고 그 아래에 있는 qbuttongroup.h에는 addButton 이 아닌 insert만이 있었기 때문입니다. 아마도 컴파일을 하기 위한 qt는 4.3.3이 깔려 있고, 라이브러리는 qt3만 있는게 아닌가 싶습니다.

음, 사용하는 배포판은 젠투입니다. 뭐가 문제인지 다시 확인하고 추가 글 올리겠습니다.

감사합니다.

akudoku.net rancid - let's go/side kick

life is only one time

klara의 이미지

링크가 아닙니다.
QApplication내부에서 qapplication.h를 include하도록 되어있습니다.
이것은 마치 C++이 표준이 확립되기 이전에는 iostream.h와 같은 해더파일이었다가, 새로운 표준에서 이전 해더파일과 혼동되지 않도록 .h를 때고 iostream만으로 파일명을 한것과 비슷합니다.
qapplication.h를 include하는 것은 Qt3의 방식이고, Qt4부터 QApplication을 include하도록 변경되었습니다.
아마 개발용 파일도 Qt4가 아니라 Qt3밖에 안깔려 있거나, qmake가 qt4가 아니라 qt3용 qmake를 이용하신게 아닐까 생각됩니다.
qmake를 돌려서 생성되는 Makefile에는, 자동으로 qmake에 기록되어있는 해더파일 경로가 포함되도록 되어있기 때문입니다.

bus710의 이미지

저는 확실히 qmake를 쓰지 않고 매크로 떡칠한 자작 make를 사용하는 관계로 qmake 문제는 확실히 아닌 것 같습니다.
다만 말씀하신 관련 개발용 파일, 라이브러리가 qt3용만 깔려 있는게 거의 확실한 것 같습니다.

이제 제가 확인할 것은 젠투에서 qt4를 인스톨할 적에 왜 라이브러리는 qt3으로 깔았으며,
그렇다면 qt4용 라이브러리는 어떻게 깔것인가가 문제겠네요^^

감사합니다.

* 다시 확인해 보니 /usr/lib 에는 qt4가 있네요...

akudoku.net rancid - let's go/side kick

life is only one time

klara의 이미지

/usr/lib에있는건 라이브러리 파일이므로 해더파일과는관련없습니다.

bus710의 이미지

그렇군요. 왜 QTDIR은 qt3를 가리키고 있는 것인지 확인해야겠습니다. 지금 열심히 gentoo forum을 뒤지고 있습니다+_+

* http://www.mail-archive.com/gentoo-user@lists.gentoo.org/msg30113.html
위의 링크를 쫓아 보니, 슬롯 처리되어서 그렇다는 말이 나오는 군요.
위쪽에서 추천하는 대로 일단 진행해 보고 추가 댓글 올리겠습니다. 곧 잘 될 것 같네요^^

** /usr/include/qt4/ 에 관련 헤더 파일들이 들어 있네요. 대략 해결된 것 같습니다. 이제 QTDIR을 수정하는게 일이겠네요^^

*** gentoo에서는 /etc/env.d/50qtdir3 에서 QTDIR을 정의하고 있었습니다.
특별히 추가로 패키지를 깔진 않고 다만, 빌드를 다음과 같이 해주었습니다.

gcc -c test.cpp -I/usr/include/qt4/QtGui -I/usr/include/qt4/
gcc -o test -L/usr/lib/qt4 -L/usr/X11R6/lib -lQtGui -lX11 -LXext test.o

물론, gui 외에 다른 것들에 접근하게 된다면 makefile도 바꿔주어야 겠지만, 어쨋든 오늘은 맘편히 잘 수 있겠네요ㅎㅎ

akudoku.net rancid - let's go/side kick

life is only one time

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.