目前,我正在尝试使用kde4_add_library创建一个共享库。实际上,不管是add_library还是kde4_add_library,但是add_library似乎没有任何意义,因为它不能处理带有"Q_OBJECT“宏/moc文件的类?!不幸的是,编译对于许多来自子目录中的共享库类的方法来说都是“未定义的引用”,这些类是与kde4库目标链接的。错误消息如下所示:
./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)像“编辑器”这样的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时遇到问题。到目前为止有什么帮助吗?
编辑:注意到"Target“wc3libeditor有一个与其LINK_INTERFACE_LIBRARIES属性不同的INTERFACE_LINK_LIBRARIES属性。为wc3libeditor目标显示。这是否与连接问题有关?
发布于 2014-08-09 15:06:02
所以问题似乎是
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框架(5)。
我还创建了一个bug报告:bug.cgi?id=338151
https://stackoverflow.com/questions/23438731
复制相似问题