该项目的原始结构是:
其中 CMakeLists.txt 的内容如下:
cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)
project(HardwareAndSystemInformation LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5 REQUIRED COMPONENTS
Core
Gui
Widgets
WebEngineWidgets
)
set(project_headers
aboutwindow.h
datacollector.h
filesystemworkmodule.h
mainwindow.h
outerfileincluder.h
)
set(project_sources
aboutwindow.cpp
datacollector.cpp
filesystemworkmodule.cpp
main.cpp
mainwindow.cpp
outerfileincluder.cpp
)
qt5_wrap_cpp(project_sources_moc
${project_headers})
source_group("MOC Files" FILES
${project_sources_moc})
add_executable(${PROJECT_NAME} WIN32
${project_headers}
${project_sources}
${project_sources_moc}
)
target_link_libraries(${PROJECT_NAME} PUBLIC
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::WebEngineWidgets
)
get_target_property(_qmake_executable Qt5::qmake
IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir
"${_qmake_executable}" DIRECTORY)
find_program(WINDEPLOYQT_EXECUTABLE windeployqt
HINTS "${_qt_bin_dir}")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E
env PATH="${_qt_bin_dir}"
"${WINDEPLOYQT_EXECUTABLE}"
--verbose 0
--no-compiler-runtime
\"$<TARGET_FILE:${PROJECT_NAME}>\"
)
该程序集非常成功地完成,并且还生成了 .exe(在 Visual Studio 中启动)。
随着项目的进一步发展,其结构略有变化:
CMakeLists.txt 的内容是:
cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)
project(HardwareAndSystemInformation LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTORCC ON)
find_package(Qt5 REQUIRED COMPONENTS
Core
Gui
Widgets
WebEngineWidgets
)
set(project_headers
src/aboutwindow.h
src/datacollector.h
src/filesystemworkmodule.h
src/mainwindow.h
src/outerfileincluder.h
src/webengineview.h
src/windowsoptions.h
)
set(project_sources
src/aboutwindow.cpp
src/datacollector.cpp
src/filesystemworkmodule.cpp
src/main.cpp
src/mainwindow.cpp
src/outerfileincluder.cpp
src/webengineview.cpp
src/windowsoptions.cpp
)
set(project_resources resources.qrc)
qt5_wrap_cpp(project_sources_moc ${project_headers})
source_group("MOC Files" FILES ${project_sources_moc})
add_executable(${PROJECT_NAME} WIN32
${project_headers}
${project_sources}
${project_resources}
${project_sources_moc}
)
target_link_libraries(${PROJECT_NAME} PUBLIC
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::WebEngineWidgets
)
get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E
env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}"
--verbose 0
--no-compiler-runtime
\"$<TARGET_FILE:${PROJECT_NAME}>\"
)
问题是 CMake 正常地“看似”构建它(有时会弹出错误“生成过程中的错误,项目文件可能无效”,但并非总是如此)。接下来,Visual Studio 无法生成 .exe。这就是它的全部 - CMake 没有提供有关错误的任何详细信息。
乍一看,一切似乎都是正确的,因为我刚刚添加了一些带有标题的新源和一个带有图像的 .qrc。此外,qmake 构建项目时不会出错,甚至可以运行。
我知道对问题的解释是相当肤浅的,并不指望有保证的答案,但我怀疑我在某个地方搞砸了构建配置,我希望有经验的人至少能够偶然发现一个差距。


决定了。我忘记用 Q_OBJECT 宏标记使用槽和信号的类之一,因为没有为它生成 MOC 文件,因此项目没有正确构建。