2013-08-25 46 views
2

我有一個項目,我最初開始使用Qt4開發,現在正在遷移到Qt5。幾個小時後重新編寫一些代碼並刪除新棄用的調用,我可以讓項目編譯,但現在我有問題讓它鏈接。Qt4到Qt5遷移鏈接器VS2013的警告(和錯誤)

我使用CMake來生成項目文件。我開始先修改「方案的」 CMake的文件和更換遷移:用(這需要清理)

############################################# 
# find QT 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
set(CMAKE_AUTOMOC ON) 

FIND_PACKAGE(Qt5Concurrent REQUIRED) 
FIND_PACKAGE(Qt5Core REQUIRED) 
FIND_PACKAGE(Qt5Network REQUIRED) 
FIND_PACKAGE(Qt5Sql REQUIRED) 
FIND_PACKAGE(Qt5WebKit REQUIRED) 
FIND_PACKAGE(Qt5WebKitWidgets REQUIRED) 
FIND_PACKAGE(Qt5Widgets REQUIRED) 
FIND_PACKAGE(Qt5Xml REQUIRED) 

INCLUDE_DIRECTORIES(
    ${Qt5Concurrent_INCLUDE_DIRS} 
    ${QT5_FOLDER} 
    "C:/Qt/Qt5.0.2/5.0.2/msvc2012_64/include" 
) 

ADD_DEFINITIONS(${QT_DEFINITIONS}) 
############################################# 

在此之後

############################################# 
# find QT 
FIND_PACKAGE(Qt4 REQUIRED) 

# configure QT modules 
SET(QT_USER_QTCORE TRUE) 
SET(QT_USE_QTMAIN TRUE) 
SET(QT_USE_QTWEBKIT TRUE) 
SET(QT_USE_QTNETWORK TRUE) 
SET(QT_USE_QTSQL TRUE) 

SET(QT_USE_QTXML TRUE) 
SET(QT_USE_QTUITOOLS TRUE) 

# include QT requirements 
INCLUDE(${QT_USE_FILE}) 
ADD_DEFINITIONS(${QT_DEFINITIONS}) 
############################################# 

,我評論了我的所有來電ADD_SUBDIRECTORY()和開始一次添加一個。我的項目使用Log4Qt,因爲它沒有其他子目錄的依賴關係,它是我開始工作的第一個子項目。

在Log4Qt的CMakeLists.txt文件中,我只是將QT4_WRAP_CPP(MOC_SOURCE_FILES ${MOC_HEADERS})更改爲QT5_WRAP_CPP(MOC_SOURCE_FILES ${MOC_HEADERS}),將MOC_HEADERS定義爲Log4Qt中所有必需的MOC'd標頭。

當我在VS2013加載這件事而建,它編譯罰款,但聯拋出同樣的警告,每moc_ *:

>moc_stringmatchfilter.obj : warning LNK4006: "public: static struct QMetaObject const Log4Qt::StringMatchFilter::staticMetaObject" ([email protected]@[email protected]@[email protected]@B) already defined in log4qt_automoc.obj; second definition ignored 
>moc_stringmatchfilter.obj : warning LNK4006: "private: static void __cdecl Log4Qt::StringMatchFilter::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]) already defined in log4qt_automoc.obj; second definition ignored 
>moc_stringmatchfilter.obj : warning LNK4006: "public: virtual struct QMetaObject const * __cdecl Log4Qt::StringMatchFilter::metaObject(void)const " ([email protected]@[email protected]@[email protected]@XZ) already defined in log4qt_automoc.obj; second definition ignored 
>moc_stringmatchfilter.obj : warning LNK4006: "public: virtual void * __cdecl Log4Qt::StringMatchFilter::qt_metacast(char const *)" ([email protected]@[email protected]@[email protected]) already defined in log4qt_automoc.obj; second definition ignored 
>moc_stringmatchfilter.obj : warning LNK4006: "public: virtual int __cdecl Log4Qt::StringMatchFilter::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@@[email protected]) already defined in log4qt_automoc.obj; second definition ignored 
>moc_stringmatchfilter.obj : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library 

我繼續我的遷移,並繼續得到同樣的警告。例如,下面是子項目的一個整個的CMakeLists.txt文件:

PROJECT(網絡)

INCLUDE_DIRECTORIES($ {} CMAKE_CURRENT_BINARY_DIR)

SET(SOURCE_FILES RequestCache.cpp WebClient的。 CPP)

SET(MOC_HEADERS RequestCache.h WebClient.h)

SET(HEADER_FILES $ {} MOC_HEADERS)

SET(DEPENDENCY_LIST log4qt核心)

ADD_LIBRARY(網絡STATIC $ {SOURCE_FILES} $ {HEADER_FILES} $ {MOC_SOURCE_FILES})

QT5_USE_MODULES(網絡網絡)

和(一些)警告:

moc_WebClient.obj : warning LNK4006: "public: virtual struct QMetaObject const * __cdecl owl::WebClient::metaObject(void)const " ([email protected]@[email protected]@[email protected]@XZ) already defined in Network_automoc.obj; second definition ignored 
moc_WebClient.obj : warning LNK4006: "public: virtual void * __cdecl owl::WebClient::qt_metacast(char const *)" ([email protected]@[email protected]@[email protected]) already defined in Network_automoc.obj; second definition ignored 
moc_WebClient.obj : warning LNK4006: "public: virtual int __cdecl owl::WebClient::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@@[email protected]) already defined in Network_automoc.obj; second definition ignored 
moc_WebClient.obj : warning LNK4006: "private: static void __cdecl owl::WebClient::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]) already defined in Network_automoc.obj; second definition ignored 
moc_WebClient.obj : warning LNK4006: "public: static struct QMetaObject const owl::WebClient::staticMetaObject" ([email protected]@[email protected]@[email protected]@B) already defined in Network_automoc.obj; second definition ignored 
moc_WebClient.obj : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library 

繼續前進,我繼續前進,並添加了所有相關的項目,並試圖構建項目的可執行文件。然後,我得到了以下錯誤(可執行文件的項目名稱爲「貓頭鷹」)(這是錯誤的摘要,而不是完整的列表):

error LNK2005: "public: static struct QMetaObject const owl::PostListWebView::staticMetaObject" ([email protected]@[email protected]@[email protected]@B) already defined in moc_PostListView.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 
error LNK2005: "private: static void __cdecl owl::PostListWebView::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]) already defined in moc_PostListView.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 
error LNK2005: "public: virtual struct QMetaObject const * __cdecl owl::BoardTreeView::metaObject(void)const " ([email protected]@[email protected]@[email protected]@XZ) already defined in moc_BoardTreeView.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 
error LNK2005: "public: virtual void * __cdecl owl::BoardTreeView::qt_metacast(char const *)" ([email protected]@[email protected]@[email protected]) already defined in moc_BoardTreeView.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 
error LNK2005: "public: virtual int __cdecl owl::BoardTreeView::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@@[email protected]) already defined in moc_BoardTreeView.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 
error LNK2005: "private: static void __cdecl owl::BoardTreeView::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]) already defined in moc_BoardTreeView.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 
error LNK2005: "public: virtual struct QMetaObject const * __cdecl owl::ConfiguringBoardDlg::metaObject(void)const " ([email protected]@[email protected]@[email protected]@XZ) already defined in moc_ConfiguringBoardDlg.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 
error LNK2005: "public: virtual void * __cdecl owl::ConfiguringBoardDlg::qt_metacast(char const *)" ([email protected]@[email protected]@[email protected]) already defined in moc_ConfiguringBoardDlg.obj C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj Owl 

我在做什麼錯?我必須在我的CMake文件中解決這個問題嗎?我沒有看到我如何錯誤地配置CMake,或者是否有其他東西丟失?

謝謝!

回答

3

感覺就像你沒有正確地清理你的項目構建目錄。此外,如果您的CMake版本足夠高,您可以嘗試使用CMAKE_AUTOMOC。更多詳情here

+1

我有CMAKE_AUTOMOC上,這是我的問題的一部分。我也是在我個人的項目文件中進行MOC的。我的猜測是我是「雙重MOC」,因此鏈接器看到每個MOC功能的兩個定義。我嘗試刪除單個MOC呼叫,但是這產生了另一個錯誤。所以,而是我關掉了汽車,這似乎修復它!所以你的回答讓我朝着正確的方向前進!非常感謝!! – Addy