[CMake] Using Qt moc and inheriting from QwtPlot
Isaac Abbott
isaac.abbott at gmail.com
Wed May 28 16:17:51 EDT 2008
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 below.
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 at 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.dir\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 ==========
****************************************************************************************************************************
scatterplot.h
****************************************************************************************************************************
#include <qwt_plot.h>
class ScatterPlot : public QwtPlot
{
Q_OBJECT
public:
ScatterPlot(QWidget *parent = NULL){};
};
****************************************************************************************************************************
main.cpp
****************************************************************************************************************************
#include <QtGui/QApplication>
#include <qwt_plot.h>
#include "scatterplot.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ScatterPlot *plot = new ScatterPlot();
return app.exec();
}
****************************************************************************************************************************
CMakeLists.txt
****************************************************************************************************************************
# set project's name
PROJECT( ThreeSpaceViewer )
OPTION(MYPROJECT_DEBUG
"Build the project using debugging code"
ON)
IF(MYPROJECT_DEBUG)
SET(CMAKE_BUILD_TYPE debug)
SET(CMAKE_CONFIGURATION_TYPES debug)
ELSE(MYPROJECT_DEBUG)
SET(CMAKE_BUILD_TYPE release)
SET(CMAKE_CONFIGURATION_TYPES release)
ENDIF(MYPROJECT_DEBUG)
# 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}
)
**************************************************************************************************************
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20080528/c5004d76/attachment-0001.htm>
More information about the CMake
mailing list