在Windows上使用CMake 2.8.11构建自定义Qt 4.8.3库时出错

时间:2013-09-16 21:07:31

标签: c++ windows qt4 cmake visual-studio-2010

我正在尝试将我的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,但我仍然得到相同的结果和错误。

4 个答案:

答案 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)

大多数

http://www.cmake.org/cmake/help/v3.0/manual/cmake-qt.7.html

也适用于CMake 2.8.11。使用导入的目标,而不是使用文件。

答案 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}

希望你解决并可以给我们反馈,这样可以帮助其他人。

编辑:在我的情况下,我解决了以下错误以获得成功的构建:

  • 正确地检查CMAKE_BUILD_TYPE对“Debug”字符串,而不是“DEBUG”,因为我在这里和那里阅读。 RTFM。
  • 将我的lib构建为STATIC,而不是SHARED。