#============================================================================= # Modern CMake Configuration for FourViews # Updated for CMake 3.28.6, VTK 9+, Qt5 #============================================================================= cmake_minimum_required(VERSION 3.20) project(FourViews LANGUAGES CXX) #----------------------------------------------------------------------------- # Global Settings #----------------------------------------------------------------------------- set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) #----------------------------------------------------------------------------- # Dependencies #----------------------------------------------------------------------------- # VTK find_package(VTK REQUIRED COMPONENTS CommonCore FiltersSources ImagingCore InteractionStyle RenderingCore RenderingOpenGL2 RenderingVolumeOpenGL2 GUISupportQt IOImage ) # Qt5 find_package(Qt5 REQUIRED COMPONENTS Widgets OpenGL) #----------------------------------------------------------------------------- # Source Files #----------------------------------------------------------------------------- set(PROJECT_SRCS main.cpp MainWindow.cpp vtkSynchronizedView.cpp vtkOrientationAnnotation.cpp vtkViewImage.cpp vtkViewImage3D.cpp vtkDataSet3DCroppingPlaneCallback.cpp vtkOrientedBoxWidget.cpp vtkImage3DCroppingBoxCallback.cpp vtkViewImage2D.cpp vtkViewImage2DCommand.cpp vtkInteractorStyleImage2D.cpp vtkViewImage2DFullCommand.cpp vtkImageBlendWithMask.cpp vtkRulerWidget.cpp vtkBorderSelectionWidget.cpp vtkCornerChineseAnnotation.cpp vtkFreeTypeUtilitiesUnicode.cpp vtkFTGLChineseCharacterMapper.cpp vtkTextUnicodeProperty.cpp ) set(PROJECT_HDRS MainWindow.h vtkSynchronizedView.h vtkOrientationAnnotation.h vtkViewImage.h vtkViewImage3D.h vtkDataSet3DCroppingPlaneCallback.h vtkOrientedBoxWidget.h vtkImage3DCroppingBoxCallback.h vtkViewImage2D.h vtkViewImage2DCommand.h vtkInteractorStyleImage2D.h vtkViewImage2DFullCommand.h vtkImageBlendWithMask.h vtkRulerWidget.h vtkBorderSelectionWidget.h vtkCornerChineseAnnotation.h vtkFreeTypeUtilitiesUnicode.h vtkFTGLChineseCharacterMapper.h vtkTextUnicodeProperty.h resource.h ) set(PROJECT_UIS MainWindow.ui ) set(PROJECT_RCCS resource.qrc ) # Windows资源文件 if(WIN32) list(APPEND PROJECT_SRCS icon.rc) endif() #----------------------------------------------------------------------------- # Target #----------------------------------------------------------------------------- add_executable(${PROJECT_NAME} ${PROJECT_SRCS} ${PROJECT_HDRS} ${PROJECT_UIS} ${PROJECT_RCCS} ) # Include directories target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) # Link libraries target_link_libraries(${PROJECT_NAME} PRIVATE ${VTK_LIBRARIES} Qt5::Widgets Qt5::OpenGL ) # VTK 模块初始化 vtk_module_autoinit( TARGETS ${PROJECT_NAME} MODULES ${VTK_LIBRARIES} ) #----------------------------------------------------------------------------- # Windows Specific #----------------------------------------------------------------------------- if(WIN32) # 设置Windows应用程序 set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE ) if(MSVC) # 获取Qt二进制目录 get_target_property(QT5_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) get_filename_component(QT5_BIN_DIR "${QT5_QMAKE_EXECUTABLE}" DIRECTORY) # 复制Qt DLL到输出目录 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${QT5_BIN_DIR}/Qt5Core.dll" "${QT5_BIN_DIR}/Qt5Gui.dll" "${QT5_BIN_DIR}/Qt5Widgets.dll" "${QT5_BIN_DIR}/Qt5OpenGL.dll" $ COMMENT "Copying Qt DLLs..." ) # 创建Visual Studio启动脚本 - 使用传统方法 foreach(CONFIG_TYPE Debug Release) if(CONFIG_TYPE STREQUAL "Debug") set(BUILD_TYPE "debug") else() set(BUILD_TYPE "release") endif() # 如果 StartVS.bat.in 存在,使用它 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/StartVS.bat.in") # 读取模板文件 file(READ "${CMAKE_CURRENT_SOURCE_DIR}/StartVS.bat.in" START_VS_TEMPLATE) # 替换模板中的变量 string(REPLACE "@PROJECT_RUNTIME_PATH@" "${QT5_BIN_DIR};${VTK_LIBRARY_DIRS}" START_VS_TEMPLATE "${START_VS_TEMPLATE}") string(REPLACE "@VS_BUILD_TYPE@" "${BUILD_TYPE}" START_VS_TEMPLATE "${START_VS_TEMPLATE}") # 写入文件 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/StartVS_${BUILD_TYPE}.bat" "${START_VS_TEMPLATE}") else() # 创建简单的启动脚本 set(START_VS_BAT_CONTENT " @echo off set PATH=%PATH%;${QT5_BIN_DIR};${VTK_LIBRARY_DIRS} \"${CMAKE_VS_DEVENV_COMMAND}\" \"${CMAKE_CURRENT_BINARY_DIR}/FourViews.sln\" ") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/StartVS_${BUILD_TYPE}.bat" "${START_VS_BAT_CONTENT}") endif() endforeach() endif() endif() #----------------------------------------------------------------------------- # Install Rules (修复警告:移除RESOURCE属性,因为图标已编译进exe) #----------------------------------------------------------------------------- install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin BUNDLE DESTINATION . ) #----------------------------------------------------------------------------- # Summary #----------------------------------------------------------------------------- message(STATUS "===========================================") message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "VTK Version: ${VTK_VERSION}") message(STATUS "Qt Version: ${Qt5_VERSION} (Qt5)") message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") message(STATUS "Windows SDK: ${CMAKE_SYSTEM_VERSION}") message(STATUS "Qt5 Bin Dir: ${QT5_BIN_DIR}") message(STATUS "===========================================")