Qt4 を使用して最初に開発を開始したプロジェクトがあり、現在は Qt5 への移行に取り組んでいます。数時間かけていくつかのコードを作り直し、新しく非推奨になった呼び出しを削除した後、プロジェクトをコンパイルすることができましたが、今はリンクするのに問題があります。
CMake を使用してプロジェクト ファイルを生成しています。最初に「ソリューション」の 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})
#############################################
with (これはクリーンアップする必要があります)
#############################################
# 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})
#############################################
この後、すべての呼び出しをコメントアウトし、ADD_SUBDIRECTORY()
一度に 1 つずつ追加し直しました。私のプロジェクトはLog4Qtを使用しており、他のサブディレクトリに他の依存関係がないため、これが私が取り組み始めた最初のサブプロジェクトでした。
Log4Qt の CMakeLists.txt ファイルで、Log4Qtで必ず MOC されたすべてのヘッダーとして定義されている に変更QT4_WRAP_CPP(MOC_SOURCE_FILES ${MOC_HEADERS})
しただけです。QT5_WRAP_CPP(MOC_SOURCE_FILES ${MOC_HEADERS})
MOC_HEADERS
これを VS2013 にロードしてビルドすると、正常にコンパイルされますが、リンクするとすべての 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
移行を続行しましたが、引き続き同じ警告が表示されます。たとえば、サブプロジェクトの 1 つの CMakeLists.txt ファイル全体を次に示します。
プロジェクト(ネットワーク)
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(ネットワーク スタティック ${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 " (?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」です) (これはエラーの抜粋であり、完全なリストではありません)。
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
私は何を間違っていますか?CMake ファイルでこれを修正する必要がありますか? CMake を正しく構成していない方法がわかりませんか、それとも他に何か不足していますか?
ありがとうございました!