0

現在、kde4_add_library を使用して共有ライブラリを作成しようとしています。実際には add_library か kde4_add_library かは問題ではありませんが、"Q_OBJECT" マクロ/moc ファイルを含むクラスを処理できないため、add_library は意味をなさないようです?! 残念ながら、コンパイルすると、kde4 lib ターゲットに対してリンクされているサブディレクトリ内の共有ライブラリのクラスからの多くのメソッドに対して「未定義の参照」と表示されます。エラー メッセージは次のようになります。

 ./wc3lib/src/editor/editor.cpp:71: undefined reference to `wc3lib::editor::BlpCodec::startup()'

パッケージを見つけるために、次のマクロを使用します。

if (EDITOR)
    find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
elseif (PLUGINS)
    find_package(Qt4 COMPONENTS QtCore QtGui)
endif ()

if (${QT4_FOUND})
    include(${QT_USE_FILE})
    add_definitions(${QT_DEFINITIONS})
    include_directories(${QT_INCLUDE_DIR})
endif ()

if (EDITOR)
    find_package(KDE4 REQUIRED)
elseif (PLUGINS)
    find_package(KDE4) # only for MPQ plugins
endif ()

if (${KDE4_FOUND})
    include(KDE4Defaults)
    add_definitions(${KDE4_DEFINITIONS})
    include_directories(${KDE4_INCLUDE_DIR} ${KDE4_INCLUDES})
    link_directories(${KDE4_LIB_DIR})
endif ()

  find_package(OGRE COMPONENTS Paging Terrain REQUIRED)

if (${OGRE_FOUND})
    include_directories(${OGRE_INCLUDE_DIRS})
    link_directories(${OGRE_LIB_DIR})
endif ()

その後、サブディレクトリが追加されます。

 if (BLP AND ${OGRE_FOUND})
add_subdirectory(Plugin_BlpCodec)
 endif ()
 if (MPQ AND ${KDE4_FOUND})
add_subdirectory(kio_mpq)
 endif ()
 if (BLP AND ${QT4_FOUND})
add_subdirectory(qblp)
 endif ()

KDE マクロのないターゲットが含まれています。

 add_library(Plugin_BlpCodec SHARED ${wc3lib_EDITOR_PLUGIN_BLPCODEC_SRC})
 target_link_libraries(Plugin_BlpCodec wc3libblp ${Boost_LIBRARIES} ${OGRE_LIBRARIES} ${GETTEXT_LIBRARIES})

最後に、親ディレクトリに KDE ターゲットが作成されます。

 kde4_add_library(wc3libeditor SHARED ${wc3lib_EDITOR_SRC} ${wc3lib_EDITOR_UI_H})
 target_link_libraries(wc3libeditor ${wc3lib_CORE_LIBRARIES} ${GETTEXT_LIBRARIES} ${Boost_LIBRARIES} ${OGRE_LIBRARIES} ${QT_LIBRARIES} ${KDE4_KIO_LIBS} ${KDE4_KUTILS_LIBS} ${KDE4_KPARTS_LIBS} Plugin_BlpCodec qblp)

「EDITOR」などの CMake オプションはすべて有効になっています。リンクされた 1 つのライブラリ「qblp」については、Qt のものをいくつか使用します。

 add_definitions(${QT_DEFINITIONS})
 add_definitions(-DQT_PLUGIN)
 add_definitions(-DQT_SHARED)

もう1つは単に「add_library」を使用し、それ自体にもシステムライブラリがリンクされています。これらの依存関係はどれもコンパイルに失敗しません。メソッドはすべて定義されています。私が使う

 cmake_minimum_required(VERSION 2.8.4)

kdelibs-4.11.5 qtcore-4.8.5-r1

CMake 経由で Qt/KDE を使用する際に問題が発生したのはこれが初めてではありません。これまでに何か助けはありますか?

編集: 「ターゲット "wc3libeditor" には、その LINK_INTERFACE_LIBRARIES プロパティとは異なる INTERFACE_LINK_LIBRARIES プロパティがある」ことに注意してください。wc3libeditor ターゲットに表示されます。これはリンクの問題に関連していますか?

4

1 に答える 1