[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