记录自己在学习MITK过程中成功运行官网教程案例的过程。
前提:成功编译好MITK源码,明确自己是构建类型是哪个(如 Debug 或 Release)
目标:想在自己的项目中运行官网的教程案例Step系列,而不是直接cmake配置中添加了相 关插件,在mitk源码中运行其step系列教程。
项目配置:MITK-v2024.12-windows-x86_64 :release版本成功编译,生成了依赖库
vs 2022
Qt 6.8.3
目录
Cmakelist
1. 在F:\MITK-2024.12\MITK\Examples\Tutorial中找到教程StepX系列的源代码之后,将其复制到自己项目目录,新建一个CMakeLists.txt文件配置文件:
2. 打开CMakeLists.txt文件,查找 Qt6 的核心库模块,尤其是 GUI 所需的 Core、Widgets、OpenGL 模块。
find_package(Qt6 REQUIRED COMPONENTS Core Widgets OpenGL)
3. 然后把找到的 Qt 模块头文件路径、库路径等引入。
include_directories(${Qt6_INCLUDE_DIRS})
4. 之后根据Step1缺失的头文件,添加头文件搜索路径,具体内容根据自己目录设定,使打开编译好的step.cpp不再出现头文件找不到错误:
include_directories(F:/MITK-2024.12/MITK/Modules/QtWidgets/include)
include_directories(F:/MITK-2024.12/MITK/Modules/Log/include)
include_directories(F:/MITK-2024.12/MITK/Modules/Core/include)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/src/util)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/src/module)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/src/service)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/include)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/QtWidgets)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/Log)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/CppMicroServices/core/include)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/CppMicroServices/include)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/Core)
include_directories(F:/MITK-2024.12/build/MITK-build)
include_directories(F:/MITK-2024.12/build/ep/include)
include_directories(F:/MITK-2024.12/build/ep/include/vtk-9.3)
include_directories(F:/MITK-2024.12/build/ep/include/ITK-5.4)
include_directories(E:/QT/6.8.3/msvc2022_64/include)
include_directories(E:/QT/6.8.3/msvc2022_64/include/QtOpenGLWidgets)
5. 查找并收集所有 .lib 静态库文件,这里有两种方式:
file(GLOB ...)
+target_link_libraries():
自动查找并收集所有.lib
静态库文件,保存在变量MITK_LIBS
中。- 硬编码使用target_link_directories()+target_link_libraries()链接具体库名:需要将用到的所有库名添加进来
5.1 首先是第一种方式,更加简洁方便:
# 自动查找并收集所有 .lib 静态库文件 GLOB_RECURSE是递归子目录 GLOB只查找当前目录
file(GLOB MITK_LIBS
"F:/MITK-2024.12/build/MITK-build/lib/Release/*.lib"
"F:/MITK-2024.12/build/ep/lib/*.lib")
# 构建时输出这些 .lib 的路径,验证是否查找成功。
message(STATUS "Found MITK libs: ${MITK_LIBS}")
5.2 第二种硬编码方式将所有的库名链接到可执行文件,cmakelist文件过于冗余,不利于维护,但能具体指定需要使用哪些库:
# 添加lib文件搜索路径-硬编码方式
# 采用这个方式需要在后续的target_link_libraries中告诉编译器具体要链接哪些库。
target_link_directories(Step1Executable PRIVATE
F:/MITK-2024.12/build/MITK-build/lib/Release
F:/MITK-2024.12/build/ep/lib
)
然后在该目录搜集其lib文件名,可以使用下面脚本,新建一个txt文档,加入下面内容,保存之后将文件后缀改为bat,将该脚本添加到上面两个目录中,点击运行生成一个LIBLIST.TXT文件,其中就包含了该目录下所有的lib文件名,后续就可以复制和可执行文件链接起来:
DIR *.lib /B >LIBLIST.TXT
使用 target_link_libraries() 链接具体库名:
6. 然后添加Step为可执行文件:
# 添加可执行文件Step1
add_executable(Step1Executable Step1_Myproject.cpp)
7. 链接库到可执行文件,这里我使用的是GLOB方式,cmakelist文件简介一点
:
#链接库到可执行文件
target_link_libraries(Step1Executable PRIVATE
Qt6::Core
Qt6::Widgets
Qt6::OpenGL
${MITK_LIBS}
)
总体cmakelist文件内容如下:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 3.10)
# 项目信息
project (MitkStep1 VERSION 1.0)
#设置C++标准为C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找 Qt6 的核心库模块,尤其是 GUI 所需的 Core、Widgets、OpenGL 模块。
# 查找成功后,Qt6 会提供:头文件路径:${Qt6_INCLUDE_DIRS},库路径和链接方式:例如 Qt6::Widgets
# Mitk用不了这个方式,MITK_USE_FILE找不到
find_package(Qt6 REQUIRED COMPONENTS Core Widgets OpenGL)
# 把找到的 Qt 模块头文件路径、库路径等引入
include_directories(${Qt6_INCLUDE_DIRS})
#添加头文件搜索路径
include_directories(F:/MITK-2024.12/MITK/Modules/QtWidgets/include)
include_directories(F:/MITK-2024.12/MITK/Modules/Log/include)
include_directories(F:/MITK-2024.12/MITK/Modules/Core/include)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/src/util)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/src/module)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/src/service)
include_directories(F:/MITK-2024.12/MITK/Modules/CppMicroServices/core/include)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/QtWidgets)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/Log)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/CppMicroServices/core/include)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/CppMicroServices/include)
include_directories(F:/MITK-2024.12/build/MITK-build/Modules/Core)
include_directories(F:/MITK-2024.12/build/MITK-build)
include_directories(F:/MITK-2024.12/build/ep/include)
include_directories(F:/MITK-2024.12/build/ep/include/vtk-9.3)
include_directories(F:/MITK-2024.12/build/ep/include/ITK-5.4)
include_directories(E:/QT/6.8.3/msvc2022_64/include)
include_directories(E:/QT/6.8.3/msvc2022_64/include/QtOpenGLWidgets)
# 添加可执行文件Step1
add_executable(Step1Executable Step1_Myproject.cpp)
# 自动查找并收集所有 .lib 静态库文件 GLOB_RECURSE是递归子目录 GLOB只查找当前目录
file(GLOB MITK_LIBS
"F:/MITK-2024.12/build/MITK-build/lib/Release/*.lib"
"F:/MITK-2024.12/build/ep/lib/*.lib")
# 构建时输出这些 .lib 的路径,验证是否查找成功。
message(STATUS "Found MITK libs: ${MITK_LIBS}")
# 添加lib文件搜索路径-硬编码方式
# 采用这个方式需要在后续的target_link_libraries中告诉编译器具体要链接哪些库。
# target_link_directories(Step1Executable PRIVATE
# F:/MITK-2024.12/build/MITK-build/lib/Release
# F:/MITK-2024.12/build/ep/lib
# )
#链接库到可执行文件
target_link_libraries(Step1Executable PRIVATE
Qt6::Core
Qt6::Widgets
Qt6::OpenGL
${MITK_LIBS}
)
至此,cmakelist文件内容完成!下面编译cmakelist文件生成系统构建文件,其他step系列的cmakelist文件类似编写即可。
生成构建文件
CMake 推荐使用 "Out-of-source" 构建方式,即将构建文件放在源代码目录之外的独立目录中。这样可以保持源代码目录的整洁,并方便管理不同的构建配置。
1. 首先打开命令行, 在项目的根目录下,创建一个新的构建目录(mkdir build)。例如,可以创建一个名为 build 的目录。我在我的Step1_Myproject.cpp所在文件夹中创建了build文件夹
2. 进入build 文件夹(cd build),在构建目录中运行 CMake 命令(cmake ..)
3. CMake 会输出配置过程中的详细信息,包括找到的库、定义的选项等,如果没有错误,构建系统文件将被生成到构建目录中。
编译和构建
我使用的是 Visual Studio,正常情况下在构建目录中生成了 Visual Studio 工程文件,可以打开 .sln 文件,然后在 Visual Studio 中选择构建解决方案。(注意这里需要指定构建类型(如 Debug 或 Release)和MITK编译时一致):
在生成中生成解决方案或者右键点击ALL_BUILD生成即可(根据错误导入对应的包含目录和库),然后将Step1Executable可执行程序设为启动项。
运行
右键Step1Executable点击属性设置程序的命令参数:F:\MITK-2024.12\build\MITK-Data\Pic3D.nrrd,然后运行程序即可:
启动运行程序:
其他的step系列教程也是按照编写cmakelsit文件配置系统构建文件,创建构建文件夹,使用 CMake 生成构建文件,编译和构建,之后打开vs2022修改其出现的错误(比如cmakelsit中缺失的头文件路径,库的缺失)。