我正在尝试将我的Qt项目从QMake迁移到CMake但是在尝试使用MSVC10在Windows 7上构建我的库时遇到了一些错误。我的CMakeLists.txt文件如下:
cmake_minimum_required( VERSION 2.8.11 )
project( MyLibrary )
find_package(Qt4 REQUIRED)
set( CMAKE_AUTOMOC ON )
set( QT_USE_QTSCRIPT TRUE )
include( ${QT_USE_FILE} )
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/include ${QT_INCLUDES} )
set( MyLibrary_SOURCES
src/connection.cpp
src/mylibrary.cpp
src/node.cpp
src/socket.cpp
include/connection.h
include/mylibrary.h
include/node.h
include/socket.h
include/MyLibrary_global.h
)
add_library(MyLibrary SHARED ${MyLibrary_SOURCES})
target_link_libraries(MyLibrary ${QT_LIBRARIES} )
当我运行时,我尝试使用生成的nmake Makefile进行构建时出现以下错误:
C2491:'Connection::staticMetaObjectExtraData' : definition of dllimport static data member not allowed
C2491: 'Connection::staticMetaObject' : definition of dllimport static data member not allowed
我是CMake的新手,所以我不确定我是否遗漏了CMakeLists.txt文件中的内容,或者是否有更多技巧可以将其与Qt一起使用。我应该提一下,获得错误的文件是MOC生成的文件。
编辑:
的输出消息($ {QT_INCLUDES})
如下(格式是为了便于阅读):
C:/Qt/4.8.3/include/QtDesigner
C:/Qt/4.8.3/include/QtDeclarative
C:/Qt/4.8.3/include/QtScriptTools
C:/Qt/4.8.3/include/QtDBus
C:/Qt/4.8.3/include/QtDesigner
C:/Qt/4.8.3/include/QtXml
C:/Qt/4.8.3/include/QtSql
C:/Qt/4.8.3/include/QtOpenGL
C:/Qt/4.8.3/include/QtMultimedia
C:/Qt/4.8.3/include/QtNetwork
C:/Qt/4.8.3/include/phonon
C:/Qt/4.8.3/include/QtXmlPatterns
C:/Qt/4.8.3/include/QtWebKit
C:/Qt/4.8.3/include/QtHelp
C:/Qt/4.8.3/include/QtUiTools
C:/Qt/4.8.3/include/QtTest
C:/Qt/4.8.3/include/QtScript
C:/Qt/4.8.3/include/QtSvg
C:/Qt/4.8.3/include/Qt3Support
C:/Qt/4.8.3/include/QtGui
C:/Qt/4.8.3/include/QtCore
C:/Qt/4.8.3/mkspecs/default
C:/Qt/4.8.3/include
C:/Qt/4.8.3/include/QtCore
我尝试不使用auto-moc,但我仍然得到相同的结果和错误。
答案 0 :(得分:3)
读这个:Export QObject-based class to DLL我发现了什么错误:
在.pro文件中我有以下内容: DEFINES + = APPLETTUTORIAL1_LIBRARY
然后在applet-tutorial1_global.h中我有:
#if defined(APPLETTUTORIAL1_LIBRARY)
# define APPLETTUTORIAL1SHARED_EXPORT Q_DECL_EXPORT
#else
# define APPLETTUTORIAL1SHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // APPLETTUTORIAL1_GLOBAL_H
由于我没有CMakeLists.txt中的等价物,编译器会转到
# define APPLETTUTORIAL1SHARED_EXPORT Q_DECL_IMPORT
行而不是预期的行:
# define APPLETTUTORIAL1SHARED_EXPORT Q_DECL_EXPORT
所以我的解决方案是只留下这一行,我的共享库也很好!
# define APPLETTUTORIAL1SHARED_EXPORT Q_DECL_EXPORT
我在阅读了这篇文章之后尝试了以下CMakeLists.txt:http://www.cmake.org/Wiki/CMake:ConvertFromQmake但是我认为我做错了,因此上面的解决方案。
SET(DEFINES "APPLETTUTORIAL1_LIBRARY")
答案 1 :(得分:1)
答案 2 :(得分:0)
好的,我有3个想法,不确定它们是否会导致解决方案,但它可以起作用。
首先,${QT_INCLUDES}
中的内容是什么?请添加一些message(${QT_INCLUDES})
并分享输出。
第二个想法是手动模拟,作为模拟中的错误orrurs。为此,请尝试删除set( CMAKE_AUTOMOC ON )
并添加:
set(QT_USE_QTUITOOLS true)
QT4_WRAP_UI(UI UiFiles.ui)
QT4_WRAP_CPP(MOC3 QObjectFiles.h)
add_library(..........
${UI}
${MOC3})
我的第三个想法是删除SHARED
,这可能会导致错误,但我不确定该错误。
请分享你得到的内容,我会尽力帮助:)
答案 3 :(得分:0)
我没有足够的声誉来添加评论所以我必须写一个答案...... 同样的问题,但Qt4.8.5在这里。
继续使用CMAKE_AUTOMOC,因为QT4_WRAP_CPP是旧的做法...我发现了这个:http://plagatux.es/2012/12/qt-automoc-with-cmake/
当我使用旧方式时,我遇到了相同的链接错误。使用AUTOMOC,我得到了其他的链接/编译错误,但我想我可以走得更远:
applettutorial1.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) const tutorial1::AppletTutorial1::`vftable'{for `XAppletPlugin'}" (__imp_??_7AppletTutorial1@tutorial1@@6BXAppletPlugin@@@) referenced in function "public: __cdecl tutorial1::AppletTutorial1::AppletTutorial1(void)" (??0AppletTutorial1@tutorial1@@QEAA@XZ)
您可以将此添加到您的包含:
${QT_QTCORE_INCLUDE_DIR}
${QT_INCLUDE_DIR}
希望你解决并可以给我们反馈,这样可以帮助其他人。
编辑:在我的情况下,我解决了以下错误以获得成功的构建: