如何通过CMake为Qt Moc添加预定义宏?解决元对象编译无输出问题
解决Moc无法识别Qt命名空间枚举的CMake配置问题
你的头文件通过WITH_QT宏包裹Qt相关代码,但当前CMake配置中,qt5_wrap_cpp调用Moc时未传入该宏,导致Moc处理foo.h时跳过了Q_NAMESPACE和Q_ENUM_NS定义,输出foo.h:0: Note: No relevant classes found. No output generated.,无法生成对应Moc代码。
方案一:给qt5_wrap_cpp传递预定义宏
修改qt5_wrap_cpp调用,添加DEFINES参数指定WITH_QT:
qt5_wrap_cpp(moc_source foo.h DEFINES WITH_QT)
这样Moc处理头文件时会预定义WITH_QT,就能正确识别Qt相关宏并生成代码。
方案二:使用AUTOMOC自动处理(推荐)
CMake的Qt支持中,AUTOMOC可自动触发Moc处理,且会继承目标的编译定义,无需手动调用qt5_wrap_cpp。修改CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.13) find_package(Qt5 COMPONENTS Core REQUIRED) add_library(foo STATIC foo.h) target_compile_definitions(foo PUBLIC WITH_QT) set_target_properties(foo PROPERTIES AUTOMOC ON)
这种方式更简洁,AUTOMOC会自动为目标头文件运行Moc,并带上target_compile_definitions中定义的WITH_QT宏,确保Moc正确解析头文件内容。
内容的提问来源于stack exchange,提问作者Stewart
相关产品推荐
相关产品推荐

