Hello, I want to use the following files under the directory gui to
creat a share library named FreeReciteGui.so .
$ tree
gui
|-- CMakeLists.txt
|-- MainWindow.cpp
|-- MainWindow.h
|-- MainWindow.ui
|-- ReciterWidget.cpp
|-- ReciterWidget.h
|-- ScannerWidget.cpp
|-- ScannerWidget.h
|-- ScannerWidget.ui
|-- TaskModel.cpp
|-- TaskModel.h
|-- TesterWidget.cpp
`-- TesterWidget.h
When I link the program to this library, it always hint me:
Linking CXX shared library libFreeReciteGui.so
[ 36%] Built target FreeReciteGui
[ 94%] Built target FreeReciteCore
Linking CXX executable ../bin/FreeRecite-core
gui/libFreeReciteGui.so: undefined reference to `vtable for ScannerWidget'
gui/libFreeReciteGui.so: undefined reference to
`ScannerWidget::complished()'
gui/libFreeReciteGui.so: undefined reference to
`ScannerWidget::qt_metacall(QMetaObject::Call, int, void**)'
gui/libFreeReciteGui.so: undefined reference to `typeinfo for ScannerWidget'
gui/libFreeReciteGui.so: undefined reference to `vtable for MainWindow'
gui/libFreeReciteGui.so: undefined reference to
`ScannerWidget::staticMetaObject'
gui/libFreeReciteGui.so: undefined reference to
`ScannerWidget::metaObject() const'
gui/libFreeReciteGui.so: undefined reference to
`ScannerWidget::qt_metacast(char const*)'
collect2: ld returned 1 exit status
make[2]: *** [bin/FreeRecite-core] Error 1
make[1]: *** [src/CMakeFiles/FreeRecite-core.dir/all] Error 2
make: *** [all] Error 2
$
But, in my model-testing with qmake, ScannerWidget and it's subclass are all
work well. So I think there must be something wrong with CMakeLists.txt
here.
Help me point it out, please.
The contents of CMaskLists.txt is :
$ cat ../src/gui/CMakeLists.txt
# Include the core library.
INCLUDE_DIRECTORIES(${FREERECITE_SOURCE_DIR}/src/core)
LINK_DIRECTORIES(${FREERECITE_BINARY_DIR}/src/core)
# with SET() command you can change variables or define new ones
# here we define SAMPLE_SRCS variable that contains a list of all .cpp files
# note that we don't need \ at the end of line
SET( FRGUI_SRCS
MainWindow.cpp
ScannerWidget.cpp
ReciterWidget.cpp
TesterWidget.cpp
TaskModel.cpp
)
# another list, this time it includes all header files that should be
treated with moc
SET( FRGUI_MOC_HDRS
MainWindow.h
ScannerWidget.h
ReciterWidget.h
TesterWidget.h
TaskModel.h
)
# some .ui files
SET( FRGUI_UIS
MainWindow.ui
ScannerWidget.ui
)
# and finally an resource file
#SET( FRGUI_RCS
# ./src/rc/sample.qrc
# )
# enable warnings
ADD_DEFINITIONS( -Wall )
# by default only QtCore and QtGui modules are enabled
# other modules must be enabled like this:
#SET( QT_USE_QT3SUPPORT TRUE )
#SET( QT_USE_QTXML TRUE )
# this command finds Qt4 libraries and sets all required variables
# note that it's Qt4, not QT4 or qt4
FIND_PACKAGE( Qt4 REQUIRED )
# add some useful macros and variables
# (QT_USE_FILE is a variable defined by FIND_PACKAGE( Qt4 ) that
contains a path to CMake script)
INCLUDE( ${QT_USE_FILE} )
# this command will generate rules that will run rcc on all files from
FRGUI_RCS
# in result FRGUI_RC_SRCS variable will contain paths to files produced
by rcc
#QT4_ADD_RESOURCES( FRGUI_RC_SRCS ${FRGUI_RCS} )
# this will run uic on .ui files:
QT4_WRAP_UI( FRGUI_UI_HDRS ${FRGUI_UIS} )
# and finally this will run moc:
QT4_WRAP_CPP( FRGUI_MOC_SRCS ${FRGUI_MOC_HDRS} )
# we need this to be able to include headers produced by uic in our code
# (CMAKE_BINARY_DIR holds a path to the build directory,
# while INCLUDE_DIRECTORIES() works just like INCLUDEPATH from qmake)
INCLUDE_DIRECTORIES( ${CMAKE_BINARY_DIR}/src/gui )
ADD_LIBRARY(FreeReciteGui SHARED
${FRGUI_SRCS}
${FRGUI_MOC_SRC}
${FRGUI_UI_HDRS}
)
INSTALL(TARGETS FreeReciteGui LIBRARY DESTINATION lib)
__________________________________________________________________
Thank you, very much.
Kermit Mei
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake