[CMake] Qt4, OpenGL and undefined references...

Andreas Nicolai Andreas.Nicolai at gmx.net
Fri Jan 26 14:03:59 EST 2007


Hi there,

I have trouble with the linker when using Qt4 with OpenGL widgets. The  
strange thing is that the same configuration file works in one project,  
and in the other it does not. Here is my CMakeLists.txt file for the  
project:

-------
project ( QuickView )

find_package( Qt4 REQUIRED )
set( QT_USE_QTGUI TRUE )
set( QT_USE_QTOPENGL TRUE )
include(${QT_USE_FILE})

add_definitions( -Wall )

set(QuickView_INCLUDEPATH
     .
     src
     ../QGLMeshPlotWidget
)

# forms
set( QuickView_UIS
     src/quickview.ui
)

# regular sources
set( QuickView_SRCS
     ../QGLMeshPlotWidget/qglmeshplotwidget.cpp
     src/quickview.cpp
     src/main.cpp
     src/d5_readnotify.cpp
)

# files we need to run moc over (all files with Q_OBJECT in it)
set( QuickView_MOC_HDRS
     ../QGLMeshPlotWidget/qglmeshplotwidget.h
     src/quickview.h
     src/d5_readnotify.h
)

# so that we have our application icon
set( QuickView_RCS
     QuickView.rc
)

# Qt resource file
set( QuickView_RESOURCES
     quickview.qrc
)

# compile resources
qt4_add_resources( QuickView_RC_SRCS ${QuickView_RESOURCES} )

# uic on .ui files
qt4_wrap_ui( QuickView_UI_HDRS ${QuickView_UIS} )

# run moc on header files with Q_OBJECT
qt4_wrap_cpp( QuickView_MOC_SRCS ${QuickView_MOC_HDRS} )

# add our include directories (necessary for ui, moc and so that we find  
the generated files)
include_directories(
	${QuickView_INCLUDEPATH}
	${QT_ADDITIONAL_INCLUDE_PATHS}
	${CMAKE_BINARY_DIR}
	${QuickView_BINARY_DIR}
)

# add the QuickView executable (built from all of the source files)
add_executable( QuickView ${QuickView_SRCS} ${QuickView_MOC_SRCS}  
${QuickView_RC_SRCS} ${QuickView_UI_HDRS} )
# and link the libraries
target_link_libraries( QuickView ${QuickView_LINK_LIBS} ${QT_LIBRARIES})

-------

However, after compilation (which works fine), I get an output like:

"C:\Program Files\CMake 2.4\bin\cmake.exe" -P  
CMakeFiles\QuickView.dir\cmake_clean_target.cmake
c:\MinGW\bin\g++.exe     -O3 -DNDEBUG    
"CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj"  
"CMakeFiles/QuickView.dir/src/quickview.obj"  
"CMakeFiles/QuickView.dir/src/main.obj"  
"CMakeFiles/QuickView.dir/src/d5_readnotify.obj"  
"CMakeFiles/QuickView.dir/moc_qglmeshplotwidget.obj"  
"CMakeFiles/QuickView.dir/moc_quickview.obj"  
"CMakeFiles/QuickView.dir/moc_d5_readnotify.obj"  
"CMakeFiles/QuickView.dir/qrc_quickview.obj"   -o QuickView.exe  
-Wl,--major-image-version,0,--minor-image-version,0   
-Ld:\ghorwin\projects\CHAMPS\development\tools\QuickView\QuickView\build\delphin_outputs_lib  
-Lc:\Qt\4.2.0\lib -Wl,-Bstatic -lQtOpenGL4 -lQtGui4 -Wl,-Bdynamic -lImm32  
-lWinmm -Wl,-Bstatic -lQtCore4 -Wl,-Bdynamic -lWs2_32
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0x721):  
undefined reference to `glDeleteLists at 8'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xb58):  
undefined reference to `glViewport at 16'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xb67):  
undefined reference to `glMatrixMode at 4'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xb6f):  
undefined reference to `glLoadIdentity at 0'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xc7a):  
undefined reference to `glOrtho at 48'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xc89):  
undefined reference to `glMatrixMode at 4'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xe3d):  
undefined reference to `glPushAttrib at 4'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xe4c):  
undefined reference to `glMatrixMode at 4'
CMakeFiles/QuickView.dir/D_/ghorwin/projects/CHAMPS/development/tools/QuickView/QGLMeshPlotWidget/qglmeshplotwidget.obj:qglmeshplotwidget.cpp:(.text+0xe54):  
undefined reference to `glPushMatrix at 0'
...
and so on


Now what am I missing in my cmake project? Could someone maybe post a  
minimal Qt4 project with OpenGL?

Thanks for the help,
Andreas



-- 
Andreas Nicolai                         anicolai at syr.edu
PhD Candidate, M.A.M.E                  (315) 443-2641
Syracuse University
151 Link Hall
Syracuse, NY, 13244


More information about the CMake mailing list