簡體   English   中英

在Windows上使用CMake 2.8.11構建自定義Qt 4.8.3庫時出錯

[英]Error while building custom Qt 4.8.3 library with CMake 2.8.11 on Windows

我正在嘗試將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,但仍然得到相同的結果和錯誤。

閱讀此內容: 將基於QObject的類導出到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")

大多數

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

也適用於CMake 2.8.11。 使用導入的目標,而不是使用文件。

好的,我有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 ,這可能會導致錯誤,但是我不確定那個錯誤。

請分享您所得到的,我會盡力幫助:)

我沒有足夠的聲譽來添加評論,所以我不得不寫一個答案...同樣的問題,但這里是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與“調試”字符串,而不是“調試”,因為我在這里和那里讀到。 RTFM。
  • 將我的庫構建為STATIC,而不是共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM