【问题标题】:Error while building custom Qt 4.8.3 library with CMake 2.8.11 on Windows在 Windows 上使用 CMake 2.8.11 构建自定义 Qt 4.8.3 库时出错
【发布时间】:2013-09-16 21:07:31
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    阅读本文:Export QObject-based class to DLL 我发现了问题所在:

    在 .pro 文件中,我有以下内容: 定义 +=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")
    

    【讨论】:

      【解决方案2】:

      大部分

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

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

      【讨论】:

        【解决方案3】:

        好的,我有 3 个想法,不确定它们是否会导致解决方案,但它可以工作。

        首先,${QT_INCLUDES} 中的内容是什么?请添加一些message(${QT_INCLUDES}) 并分享输出。

        第二个想法是手动模拟,因为模拟中会出现错误。为此,请尝试删除 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,也许这会导致错误,但我不确定那个。

        请分享你的收获,我会尽力提供帮助:)

        【讨论】:

          【解决方案4】:

          我没有足够的声誉来添加评论,所以我必须写一个答案...... 同样的问题,但这里是 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。
          • 将我的库构建为 STATIC,而不是 SHARED。

          【讨论】:

          • 成功构建为 SHARED,请参阅下面的完整答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-10
          • 2020-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多