使用 VS 2017 和 Qt 5.9 编译 VTK 8.X

目录

编译环境

Windows 下编译支持 Qt 的 VTK 需要事先安装 Qt 和 CMake。
CMake 需要找到 Qt 和 Qt 对应的编译器环境(如 vs2015 x64 或 vs2017 x64等),所以最好在已配置的命令行控制台中启动 cmake。
Qt 和 VS 2017 均自带命令行环境,例如开始菜单中的“适用于 VS 2017 的 x64 本机工具命令提示”条目可以启动 vs 2017 的编译环境。
为了加载这两个环境,可以先启动 Qt 的命令行环境,再运行vs命令行条目对应的脚本,加载 vs 2017 的编译环境,执行的脚本类似:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat

然后在命令行中运行 cmake-gui 打开 CMake。

CMake 配置

仅需进行少量修改
勾选 BUILD_EXAMPLES
修改 CMAKE_INSTALL_PREFIX,设置vtk安装目录
勾选 VTK_Group_Qt
在 Advanced 模式下,修改 INSTALL_ 开头的几个安装目录
configure 后检查 cmake 是否已找到 Qt 5 的目录,确定无误后进行 Generate,再 Open Project。

编译

在 Visual Studio 2017 中批量生成 Debug 和 Release 的 ALL BUILD 项目,然后再生成 Release 的 INSTALL 项目。

验证

编译的示例程序放在 build_dir/bin/Release 中,将 Qt 5/bin 目录下的 Qt5Core.dll、Qt5Gui.dll、Qt5Widget.dll 文件复制到该目录下,运行 QtVTKRenderWindows.exe 程序。
如果运行成功,说明 VTK 编译已成功。

示例

高版本 CMake 使用 Qt 5 的方式已更改,官网的示例无法直接编译。我修改了 BorderWidgetQt 示例的 CMakeFiles.txt:

cmake_minimum_required(VERSION 3.10)
if(POLICY CMP0020)
  cmake_policy(SET CMP0020 NEW)
endif()
PROJECT(BorderWidgetQt)
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Gui REQUIRED)
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
file(GLOB UI_FILES *.ui)
file(GLOB HEADER_FILES *.h)
file(GLOB CXX_FILES *.cxx)
add_executable(BorderWidgetQt
    ${CXX_FILES} ${UI_FILES} ${HEADER_FILES})
target_link_libraries(BorderWidgetQt ${VTK_LIBRARIES}
    Qt5::Core Qt5::Widgets Qt5::Gui)

编译前需要设置 VTK 的 cmake 文件目录,设置 VTK_DIR 为 vtk_install_dir/lib/cmake/vtk-8.1。
运行时需要将 vtk 的 dll 文件路径加到环境变量 PATH 中。
注意:install 的 bin 目录下是 Release 版的 dll,如果编译 Debug 程序,设置该路径会出错,需要使用 Debug 的 dll 文件,放在 vtk_build_dir/bin/Debug。