PDA

View Full Version : using moc with cmake



Isaac
28th May 2008, 21:52
I am creating a project that uses Qt 4.3.3 and Qwt 5.1.1 (http://qwt.sourceforge.net/).
I am using CMake version 2.4 to generate the project files for MS Visual Studio 2005 Pro (on Windows XP Pro)

I create a derived class ScatterPlot that inherits from QwtPlot and QObject.
I run into a linking error when I use the Q_OBJECT macro in my derived class as shown in attached files.

The moc_scatterplot.cxx and the moc_scatterplot.obj files are created during compilation.
If I remove the Q_OBJECT macro from the header, it compiles fine.

What am I missing? Thanks, Isaac

************************************************** ************************************************** ************************
Build Output
************************************************** ************************************************** ************************
1>------ Build started: Project: ThreeSpaceViewer, Configuration: Debug Win32 ------
1>Generating moc_scatterplot.cxx
1>Compiling...
1>moc_scatterplot.cxx
1>main.cpp
1>Generating Code...
1>Linking...
1>moc_scatterplot.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@B)
1>Debug\ThreeSpaceViewer.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Isaac\Fars_Isaac\qwt2qt\bin\ThreeSpaceViewer.di r\Debug\BuildLog.htm"
1>ThreeSpaceViewer - 2 error(s), 0 warning(s)
2>------ Skipped Build: Project: ALL_BUILD, Configuration: Debug Win32 ------
2>Project not selected to build for this solution configuration
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 1 skipped ==========

jacek
28th May 2008, 23:30
Do you link your application with Qwt?

Isaac
29th May 2008, 03:10
Sorry, I forget the most important file.
I did link with Qwt.
Here is my CMakeLists.txt:

# set project's name
PROJECT( ThreeSpaceViewer )

OPTION(MYPROJECT_DEBUG
"Build the project using debugging code"
ON)

# this command finds Qt4 libraries and sets all required variables
# note that it's Qt4, not QT4 or qt4

FIND_PACKAGE(Qt4)
IF(QT4_FOUND)
# (QT_USE_FILE is a variable defined by FIND_PACKAGE( Qt4 )
# that contains a path to CMake script)
INCLUDE( ${QT_USE_FILE} )
ELSE(QT4_FOUND)
MESSAGE(FATAL_ERROR
"Cannot build without Qt4. Please set Qt4_DIR.")
ENDIF(QT4_FOUND)


SET(QWT_FOUND "NO")

IF(QT4_FOUND)
FIND_PATH(
QWT_INCLUDE_DIR qwt.h
C:/Qt
C:/Qt/Qwt
C:/Qt/Qwt/src
)

SET(QWT_DEBUG_NAMES qwtd5 )
SET(QWT_RELEASE_NAMES qwtr5 )

FIND_LIBRARY( QWT_DEBUG_LIBRARY
NAMES ${QWT_DEBUG_NAMES}
PATHS /Qt /Qt/Qwt /Qt/Qwt/lib
)

FIND_LIBRARY( QWT_RELEASE_LIBRARY
NAMES ${QWT_RELEASE_NAMES}
PATHS /Qt /Qt/Qwt /Qt/Qwt/lib
)

IF (QWT_DEBUG_LIBRARY OR QWT_RELEASE_LIBRARY)
IF (MYPROJECT_DEBUG)
SET(QWT_LIBRARIES ${QWT_DEBUG_LIBRARY})
SET(QWT_FOUND "YES")
ELSE (MYPROJECT_DEBUG)
SET(QWT_LIBRARIES ${QWT_RELEASE_LIBRARY})
SET(QWT_FOUND "YES")
ENDIF (MYPROJECT_DEBUG)
ENDIF (QWT_DEBUG_LIBRARY OR QWT_RELEASE_LIBRARY)

ENDIF(QT4_FOUND)

INCLUDE_DIRECTORIES( ${QWT_INCLUDE_DIR} )
INCLUDE_DIRECTORIES( ${ThreeSpaceViewer_SOURCE_DIR} )
INCLUDE_DIRECTORIES( ${ThreeSpaceViewer_BINARY_DIR} )

SET( MY_SRCS
main.cpp
)

SET( MY_HDRS
scatterplot.h
)

# and finally this will run moc:
QT4_WRAP_CPP( MY_MOC_SRCS ${MY_HDRS} )

ADD_EXECUTABLE( ThreeSpaceViewer main.cpp scatterplot.h ${MY_MOC_SRCS} )


TARGET_LINK_LIBRARIES( ThreeSpaceViewer
${LINK_FLAGS}
${QWT_LIBRARIES}
${QT_LIBRARIES}
)