当链接库到KDE4库时,make: undefined引用
CMake: undefined reference when linking libraries to KDE4 lib
目前我正在尝试使用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.5qtcore-4.8.5-r1
这不是我第一次通过CMake使用Qt/KDE出现问题。到目前为止有什么帮助吗?
编辑:注意"Target"wc3libeditor有一个INTERFACE_LINK_LIBRARIES属性不同于它的LINK_INTERFACE_LIBRARIES属性。这和链接问题有关吗?
所以问题似乎是
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
有一个更好的解决方案,使用export宏:https://forum.kde.org/viewtopic.php?f=64& t = 89265
另一个解决方案可能是使用KDE框架(5)。
我还创建了一个bug报告:https://bugs.kde.org/show_bug.cgi?id=338151
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- "Undefined class"作为is_base_of的论据
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- make 命令如何避免重新编译未更改的源文件?
- MAKE:找不到包含的用户定义的头文件?
- 'make check' GLIBC 运行时的链接问题
- VSCode C/C++ Intellisense issue: Undefined identifiers (Linu
- 与卡特琳娜一起卷曲C++失败并得到"Undefined symbols for architecture x86_64"
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么在使用 SDL2 时仍然收到'undefined reference'链接器错误?
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"
- 为什么即使在定义之后仍存在"Identifier is undefined error "?
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- 当链接库到KDE4库时,make: undefined引用