в данный момент я пытаюсь создать общую библиотеку, используя kde4_add_library. На самом деле не имеет значения, является ли это add_library или kde4_add_library, но кажется, что add_library не имеет смысла, так как он не может обрабатывать классы с файлами макросов / moc «Q_OBJECT» ?! К сожалению, компиляция говорит «неопределенная ссылка» для многих методов из классов разделяемых библиотек в подкаталогах, которые связаны с целью lib 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
это не первый раз, когда у меня возникают проблемы с использованием Qt / KDE через CMake. Любая помощь до сих пор?
редактировать:
Обратите внимание, что «целевой» wc3libeditor «имеет свойство INTERFACE_LINK_LIBRARIES, которое
отличается от его свойств LINK_INTERFACE_LIBRARIES. «появляются для цели wc3libeditor. Это связано с проблемами компоновки?
Так что проблема, кажется, в том, что
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&м = 132906487119016
и есть лучшее решение, использующее макрос экспорта:
https://forum.kde.org/viewtopic.php?f=64&т = 89265
Другое решение может использовать вместо этого KDE Frameworks (5).
Я также создал отчет об ошибке: https://bugs.kde.org/show_bug.cgi?id=338151