CMake AutoMOC 生成有错误的 .cpp

CMake AutoMOC generates .cpp with errors

我有一个通过 CMake 生成的项目,它也使用 AutoMOC 标志。但是,当我打开解决方案并尝试构建项目(使用 Visual Studio 15 2017 x64 生成器)时,这个特定项目失败了。我会post下面的错误信息(有很多),但是大部分都是'struct'类型重定义错误或者因为多次初始化等导致的错误。不幸的是,因为这些错误大部分都在由 moc 自动生成的 .cpp 文件,调试起来非常困难(或者一开始就知道它们为什么会发生)。

这是我的 CMakeList.txt:

set(target QUI)

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5Widgets)
find_package(Qt5Network)
find_package(Qt5OpenGL)
find_package(Qt5PrintSupport)

if(WIN32)
    find_package(Qt5WinExtras)
endif()

set( headers
    # a bunch of headers here...
)

add_library(${target} "")

target_link_libraries(${target}
  PUBLIC Events Reflection DynamicDispatch Qt5::Widgets Qt5::Network Qt5::OpenGL Qt5::PrintSupport
  PRIVATE UI Net Registry
)

add_to_target( ${target} "${namespace}" "${headers}" "" )

generate_decl( ${target} "${namespace}" MLQ )

generate_ctags( ${tags_target} "${headers}" )

add_subdirectory( impl )

my_target_scope(${target})

然后这是我看到的错误片段。这个项目总共有大约 145 个错误。

错误:

Error   C2011   'qt_meta_stringdata_MainWindow_t': 'struct' type redefinition (compiling source file C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\mocs_compilation.cpp)   C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\EWIEGA46WW\moc_MainWindow.cpp
Error   C2374   'qt_meta_stringdata_MainWindow': redefinition; multiple initialization (compiling source file C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\mocs_compilation.cpp)  C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\EWIEGA46WW\moc_MainWindow.cpp
Error   C2027   use of undefined type 'qt_meta_stringdata_MainWindow_t' (compiling source file C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\mocs_compilation.cpp) C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\EWIEGA46WW\moc_MainWindow.cpp
Error   C2227   left of '->stringdata0' must point to class/struct/union/generic type (compiling source file C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\mocs_compilation.cpp)   C:\GIT\src\Apps\MyApp\Qt\MyApp_autogen\EWIEGA46WW\moc_MainWindow.cpp    

因此,经过大量故障排除(并将一些文件与能够在 Windows 计算机上构建解决方案的同事进行比较)...我们能够确定问题归结为如何CMake 处理了 AutoMOC 过程...我相信他们在 CMake 3.9 版中进行了更改,导致了冲突 ()。显然这在 3.10 版中已修复...并且一旦我更新到最新版本的 CMake,我的构建过程再次运行。希望这对以后的人有所帮助。

如果您使用 Windows,则此类问题的另一个原因可能是头文件和源文件之间的文件名大小写不同。如果你有 "abc.cpp" 和 "Abc.h",你最终会在 moc-ed 文件列表中有一个重复的条目。 Windows不区分大小写,但是moc系统会...