C++ VS2013的Qt4到Qt5迁移链接器警告(和错误)

C++ VS2013的Qt4到Qt5迁移链接器警告(和错误),c++,qt,qt4,cmake,qt5,C++,Qt,Qt4,Cmake,Qt5,我有一个最初使用Qt4开发的项目,现在正致力于迁移到Qt5。经过几个小时的重新编写代码和删除新的不推荐调用后,我能够让项目进行编译,但现在我在让它链接时遇到了问题 我正在使用CMake生成项目文件。我首先修改“solutions”CMake文件并替换以下内容,从而开始迁移: ############################################# # find QT FIND_PACKAGE(Qt4 REQUIRED) # configure QT modules SET(Q

我有一个最初使用Qt4开发的项目,现在正致力于迁移到Qt5。经过几个小时的重新编写代码和删除新的不推荐调用后,我能够让项目进行编译,但现在我在让它链接时遇到了问题

我正在使用CMake生成项目文件。我首先修改“solutions”CMake文件并替换以下内容,从而开始迁移:

#############################################
# 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的CMakeLists.txt文件中,我简单地将
QT4_WRAP_CPP(MOC_源文件${MOC_头文件})
更改为
QT5_WRAP_CPP(MOC_源文件${MOC_头文件})
,其中
MOC_头文件
被定义为Log4Qt中所有必要的MOC头文件

当我在VS2013和build中加载它时,它编译得很好,但是链接会为每个moc抛出相同的警告:

>moc_stringmatchfilter.obj : warning LNK4006: "public: static struct QMetaObject const Log4Qt::StringMatchFilter::staticMetaObject" (?staticMetaObject@StringMatchFilter@Log4Qt@@2UQMetaObject@@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 * *)" (?qt_static_metacall@StringMatchFilter@Log4Qt@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z) 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 " (?metaObject@StringMatchFilter@Log4Qt@@UEBAPEBUQMetaObject@@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 *)" (?qt_metacast@StringMatchFilter@Log4Qt@@UEAAPEAXPEBD@Z) 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 * *)" (?qt_metacall@StringMatchFilter@Log4Qt@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) 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文件:

项目(网络)

包含目录(${CMAKE\u CURRENT\u BINARY\u DIR})

设置(源文件RequestCache.cpp WebClient.cpp)

SET(MOC_HEADERS RequestCache.h WebClient.h)

集合(头文件${MOC\u头文件})

设置(依赖项列表log4qt核心)

添加\u库(网络静态${SOURCE\u FILES}${HEADER\u FILES} ${MOC_源文件})

QT5_使用_模块(网络)

以及(部分)警告:

moc_WebClient.obj : warning LNK4006: "public: virtual struct QMetaObject const * __cdecl owl::WebClient::metaObject(void)const " (?metaObject@WebClient@owl@@UEBAPEBUQMetaObject@@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 *)" (?qt_metacast@WebClient@owl@@UEAAPEAXPEBD@Z) 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 * *)" (?qt_metacall@WebClient@owl@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) 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 * *)" (?qt_static_metacall@WebClient@owl@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z) already defined in Network_automoc.obj; second definition ignored
moc_WebClient.obj : warning LNK4006: "public: static struct QMetaObject const owl::WebClient::staticMetaObject" (?staticMetaObject@WebClient@owl@@2UQMetaObject@@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
尽管如此,我还是继续添加了所有相关的项目,并试图构建项目的可执行文件。然后我得到了以下错误(可执行文件的项目名为“Owl”)(这是错误的摘录,而不是完整的列表):

我做错了什么?我必须在我的CMake文件中修复此问题吗?我看不出我是如何错误地配置CMake的,还是我缺少了其他东西


谢谢大家!

感觉您没有正确清理项目生成目录。此外,如果您的CMake版本足够高,您可以尝试使用
CMake\u AUTOMOC
。更多细节。

我开了CMAKE_AUTOMOC,这是我的问题的一部分。我也在记录我的个人项目文件。我猜我是“双重MOC'ing”,因此链接器看到了每个MOC'd函数的两个定义。我尝试删除单个MOC呼叫,但这产生了另一个错误。所以,我关闭了automoc,这似乎解决了它!所以,你的回答引导我走向正确的方向!非常感谢你!!
moc_WebClient.obj : warning LNK4006: "public: virtual struct QMetaObject const * __cdecl owl::WebClient::metaObject(void)const " (?metaObject@WebClient@owl@@UEBAPEBUQMetaObject@@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 *)" (?qt_metacast@WebClient@owl@@UEAAPEAXPEBD@Z) 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 * *)" (?qt_metacall@WebClient@owl@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) 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 * *)" (?qt_static_metacall@WebClient@owl@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z) already defined in Network_automoc.obj; second definition ignored
moc_WebClient.obj : warning LNK4006: "public: static struct QMetaObject const owl::WebClient::staticMetaObject" (?staticMetaObject@WebClient@owl@@2UQMetaObject@@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" (?staticMetaObject@PostListWebView@owl@@2UQMetaObject@@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 * *)" (?qt_static_metacall@PostListWebView@owl@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z) 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 " (?metaObject@BoardTreeView@owl@@UEBAPEBUQMetaObject@@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 *)" (?qt_metacast@BoardTreeView@owl@@UEAAPEAXPEBD@Z) 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 * *)" (?qt_metacall@BoardTreeView@owl@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z) 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 * *)" (?qt_static_metacall@BoardTreeView@owl@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z) 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 " (?metaObject@ConfiguringBoardDlg@owl@@UEBAPEBUQMetaObject@@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 *)" (?qt_metacast@ConfiguringBoardDlg@owl@@UEAAPEAXPEBD@Z) already defined in moc_ConfiguringBoardDlg.obj   C:\vbulletin\cmake\deltas\Win64\Deltas\Owl_automoc.obj  Owl