我有一个通过CMake生成的项目,它也使用AutoMOC标志。但是,当我打开解决方案并尝试构建项目(使用Visual Studio 15 2017 x64生成器)时,此特定项目将失败。我将在下面发布错误消息(有很多),但大多数都是' 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
答案 0 :(得分:1)
因此经过大量的故障排除(并将一些文件与能够在其Windows机器上构建解决方案的同事进行比较)......我们能够确定问题归结为CMake如何处理AutoMOC流程。 ..我相信他们在CMake版本3.9中做了一个改变,导致了冲突(see this thread)。显然这在3.10版本中修复了......一旦我更新到最新版本的CMake,我的构建过程再次起作用。希望这有助于将来的某个人。
答案 1 :(得分:0)
如果在Windows上,则此类问题的另一个原因可能是标题文件和源文件之间的文件名大小写不同。如果您有“ abc.cpp”和“ Abc.h”,则最终将在运动文件列表中出现重复的条目。 Windows无法区分大小写,但是moc系统可以区分大小写...