首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake:将库链接到KDE4库时未定义的引用

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

Stack Overflow用户
提问于 2014-05-03 00:06:15
回答 1查看 442关注 0票数 0

目前,我正在尝试使用kde4_add_library创建一个共享库。实际上,不管是add_library还是kde4_add_library,但是add_library似乎没有任何意义,因为它不能处理带有"Q_OBJECT“宏/moc文件的类?!不幸的是,编译对于许多来自子目录中的共享库类的方法来说都是“未定义的引用”,这些类是与kde4库目标链接的。错误消息如下所示:

代码语言:javascript
复制
 ./wc3lib/src/editor/editor.cpp:71: undefined reference to `wc3lib::editor::BlpCodec::startup()'

为了查找包,我使用以下宏:

代码语言:javascript
复制
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 ()

子目录在此之后添加:

代码语言:javascript
复制
 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宏的目标:

代码语言:javascript
复制
 add_library(Plugin_BlpCodec SHARED ${wc3lib_EDITOR_PLUGIN_BLPCODEC_SRC})
 target_link_libraries(Plugin_BlpCodec wc3libblp ${Boost_LIBRARIES} ${OGRE_LIBRARIES} ${GETTEXT_LIBRARIES})

现在,最后在父目录中创建KDE目标:

代码语言:javascript
复制
 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)

像“编辑器”这样的CMake选项都已启用。对于一个链接库"qblp“,我使用了一些Qt内容:

代码语言:javascript
复制
 add_definitions(${QT_DEFINITIONS})
 add_definitions(-DQT_PLUGIN)
 add_definitions(-DQT_SHARED)

另一个只使用"add_library“,它本身也有针对它的系统库。这些依赖项中没有一个不能编译。所有的方法都是定义的。我使用

代码语言:javascript
复制
 cmake_minimum_required(VERSION 2.8.4)

kdelibs 4.11.5 qtcore-4.8.5-r1

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

编辑:注意到"Target“wc3libeditor有一个与其LINK_INTERFACE_LIBRARIES属性不同的INTERFACE_LINK_LIBRARIES属性。为wc3libeditor目标显示。这是否与连接问题有关?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-09 15:06:02

所以问题似乎是

代码语言:javascript
复制
find_package(KDE4 REQUIRED)

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

代码语言:javascript
复制
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框架(5)。

我还创建了一个bug报告:bug.cgi?id=338151

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23438731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档