PDA

View Full Version : Qt4 Lib -- Linker Problems Qt4/OpenGL



Jackson.Shredder
17th January 2009, 22:09
Hello, Everyone,
I've got a perplexing problem. I'm following the Qt4 tutorials of interest and while working with the "Hello GL" example ( here (http://doc.trolltech.com/4.1/opengl-hellogl.html) ), I'm getting some linker problems that I can't figure out.

I'm using Fedora 10. I'm using monodevelop to type in the code (no abuse please from you IDE-haters! :D ) and I'm sure that part of the problem is that it doesn't add everything to the qmake Makefile. I'm not 100% familiar with Makefile generation, syntax, etc, but I can noodle out some of the important bits.

Here's the rundown. The errors I'm getting point to a linker error. From what I've been able to determine, I'm either missing or not pointing at the proper qtlib(s). I just can't seem to figure out which ones they are. Here are some of the errors I'm getting:

glwidget.o: In function `GLWidget::InitGL()':
glwidget.cpp:(.text+0x930): undefined reference to `QGLWidget::qglClearColor(QColor const&) const'
And

glwidget.o: In function `GLWidget::~GLWidget()':
glwidget.cpp:(.text+0xbe0): undefined reference to `QGLWidget::makeCurrent()'
Etc.

Also this one's a head scratcher to me as well:

moc_glwidget.o:(.rodata._ZTV8GLWidget[vtable for GLWidget]+0x1c): undefined reference to `QGLWidget::event(QEvent*)'

I saw (on this forum, actually, which is why I'm posting here) this thread:
Can't compile custom class derived from QGLWidget (http://www.qtcentre.org/forum/f-qt-programming-2/t-cant-compile-custom-class-derived-from-qglwidget-7914.html)

I tried this suggestion and it does indeed build, but I get this when I try to run the applicaion:

X Error: BadRequest (invalid request code or no such operation) 1
Extension: 143 (Uknown extension)
Minor opcode: 19 (Unknown request)
Resource id: 0x17
qt-opengl: xcb_io.c:461: _XRead: Assertion `dpy->xcb->reply_data != 0' failed.
Aborted

I don't know what this was supposed to do exactly; but it seemed to fix the 'unresolved externals' problem (yes, I learned dev on Windows/Visual Studio, don't hold it against me! :D )

Here's the LIBS section of my Makefile.

LIBS = $(SUBLIBS) -L/usr/local/Trolltech/Qt-4.4.3/lib -lQtGui -L/usr/l
ocal/Trolltech/Qt-4.4.3/lib -L/usr/X11R6/lib -pthread -lpng -lSM -lICE -pthread
-pthread -lXi -lXrender -lXrandr -lfreetype -lfontconfig -lXext -lX11 -lQtCore -
lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread

to which I (manually add) '-L/usr/lib -lGL' to clear the errors like this:

glwidget.o: In function `GLWidget::MakeObject()':
glwidget.cpp:(.text+0x33c): undefined reference to `glGenLists'


I know there's a lot here, and that I'm asking several questions, but are there any suggestions for making this all work? I'm fairly new to the subtleties of development on Linux, though not new to development.

(As an aside, if there's a really good, step by step Makefile tutorial around, point me in the right direction. Most of them I've seen seem to presume some familiarity with them... I want a "this is a mouse this a monitor" level).

wysota
18th January 2009, 00:07
Regardless of what IDE you use, you can use qmake to generate makefiles for your project. To use OpenGL all you need to do is to add QT+=opengl and rerun qmake.

Jackson.Shredder
18th January 2009, 00:19
Regardless of what IDE you use, you can use qmake to generate makefiles for your project. To use OpenGL all you need to do is to add QT+=opengl and rerun qmake.


Thanks, I appreciate the response; however, as I mentioned, that produces another problem:



I saw (on this forum, actually, which is why I'm posting here) this thread:
Can't compile custom class derived from QGLWidget (http://www.qtcentre.org/forum/f-qt-programming-2/t-cant-compile-custom-class-derived-from-qglwidget-7914.html)

I tried this suggestion and it does indeed build, but I get this when I try to run the applicaion:

X Error: BadRequest (invalid request code or no such operation) 1
Extension: 143 (Uknown extension)
Minor opcode: 19 (Unknown request)
Resource id: 0x17
qt-opengl: xcb_io.c:461: _XRead: Assertion `dpy->xcb->reply_data != 0' failed.
Aborted



I did run qmake after adding the "QT += opengl" to the .pro file.

After some more digging around on the internet and in forums, I saw that '-opengl' was a ./configure option. I didn't build it with this option initially, so I figured I'd re-install Qt4 and explicitly building it with the "-opengl" option.

wysota
18th January 2009, 10:52
OpenGL support is enabled by default provided your system allows it. Enabling it explicitly won't make a difference. From what I see you experience a run-time error from the X server, so either OpenGL support in your system is broken or you do something weird in your application. The problem is surely unrelated to the process of compilation.

Jackson.Shredder
19th January 2009, 15:08
OpenGL support is enabled by default provided your system allows it. Enabling it explicitly won't make a difference. From what I see you experience a run-time error from the X server, so either OpenGL support in your system is broken or you do something weird in your application. The problem is surely unrelated to the process of compilation.

wysota, you're almost certainly correct. I continued to dig at this problem and here's what I found.

The rpmfusion drivers are not completed for Fedora 10 and hence not released as yet. This wasn't news; however, intitially I didn't think this would matter: the proprietary ATI drivers seemed to fix the problem of my screen resolution. What I didn't put together was a crash I was getting whenever I tried using Open Office Writer (or any other OO application).

Apprently, the drivers released by ATI weren't sufficiently compatible with Fedora 10. I've gone back to Fedora 9, which does seem to work ( glxgears runs fine), but am getting artifacts:
http://i295.photobucket.com/albums/mm134/JacksonShredder/Screenshot-1.png

I realize this may not be caused by Qt; however, I also believe I can't be the first to encounter this. While I plan to continue digging around at this until I get it working, any further suggestions, thoughts, and ideas would be appreciated.

Thanks for everything so far.

wysota
19th January 2009, 18:00
Please don't use 3rd party sites for image storage, we really don't like it.

I can't help you with your application without seeing any code :) My guess is that your paintGL() is messed up.

Jackson.Shredder
19th January 2009, 18:22
No problem; what do you do for pics instead then?

Okay, the PaintGL method:

void GLWidget::PaintGL() {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glTranslated( 0.0, 0.0, -10.0 );
glRotated( ( xRot / 16.0 ), 1.0, 0.0, 0.0 );
glRotated( ( yRot / 16.0 ), 0.0, 1.0, 0.0 );
glRotated( ( zRot / 16.0 ), 0.0, 0.0, 1.0 );
glCallList( object );
}


I'm fairly certain it's not messed up.

Apparently, I'm allowed to only upload five files. If you'd like the Makefile and/or the .pro file, let me know.