CMake:将库链接到KDE4 lib时的未定义引用

时间:2014-05-03 00:06:15

标签: c++ qt cmake kde kde4

目前我正在尝试使用kde4_add_library创建共享库。实际上,无论是add_library还是kde4_add_library都没关系,但似乎add_library没有意义,因为它无法处理带有“Q_OBJECT”宏/ moc文件的类?不幸的是,编译为子目录中与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选项都已启用。 对于一个链接库“qblp”,我使用了一些Qt:

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

另一个只使用“add_library”并且自身也有与之链接的系统库。 这些依赖项都不能编译。 这些方法都已定义。 我用

 cmake_minimum_required(VERSION 2.8.4)

的kdelibs-4.11.5 qtcore-4.8.5-R1

这不是我第一次通过CMake使用Qt / KDE时遇到问题。到目前为止有任何帮助吗?

修改 请注意,“目标”wc3libeditor“具有INTERFACE_LINK_LIBRARIES属性 与LINK_INTERFACE_LIBRARIES属性不同。“wc3libeditor目标显示。这是否与链接问题有关?

1 个答案:

答案 0 :(得分:1)

所以问题似乎是那个

find_package(KDE4 REQUIRED)

添加各种C ++标志。你可以在/usr/share/apps/cmake/modules/FindKDE4Internal.cmake找到这一切。 其中一些标志会导致未定义的引用错误。 一个简单的解决方法可能是添加

set(CMAKE_CXX_FLAGS "")

在find_package语句之后有点难看。

可在此处找到更多信息: http://lists.kde.org/?l=kde-buildsystem&m=132906487119016

使用导出宏有一个更好的解决方案: https://forum.kde.org/viewtopic.php?f=64&t=89265

另一种解决方案可能是使用KDE Frameworks(5)。

我还创建了一个错误报告:https://bugs.kde.org/show_bug.cgi?id=338151