VTK 9.3.0 源码编译与集成指南

一、前置依赖安装

1. 基础编译工具链

# Ubuntu/Debian
sudo apt install build-essential cmake ninja-build mesa-common-dev libgl1-mesa-glx libglu1-mesa-dev libxt-dev
# CentOS/RHEL
sudo yum install gcc-c++ make ninja-build mesa-libGLES2-devel mesa-libGL-devel libXt-devel

2. Qt 开发环境(如需 GUI 支持)

# Ubuntu 22.04+
sudo apt install qtbase5-dev qtdeclarative5-dev qtquickcontrols2-5-dev
# CentOS 8+
sudo yum install qt5-qtbase-devel qt5-qtdeclarative-devel

⚠️ 重要提示

  • 确保 Qt 版本与 VTK 兼容(Qt ≥5.15 推荐)
  • 若自定义 Qt 路径,需在 CMake 中指定 -DQt5_DIR=/path/to/Qt/lib/cmake/Qt5

二、源码获取与准备

wget https://www.vtk.org/files/release/9.3/VTK-9.3.0.tar.gz
tar -zxvf VTK-9.3.0.tar.gz
cd VTK-9.3.0
mkdir build && cd build

🔍 源码替代方案
可通过 Git 获取最新开发分支:

git clone --branch v9.3.0 --depth 1 https://gitlab.kitware.com/vtk/vtk.git

三、CMake 配置详解

1. 基础配置

cmake -G "Ninja Multi-Config" \
  -DCMAKE_BUILD_TYPE:STRING="Release" \
  -DBUILD_SHARED_LIBS:BOOL=ON \
  -DVTK_GROUP_ENABLE_QT:STRING="WANT" \
  -DVTK_MODULE_ENABLE_VTK_GuiSupportQtQuick:STRING="DONT_WANT" \
  ..

2. 关键选项说明

选项 值类型 推荐值 作用
VTK_GROUP_ENABLE_QT STRING WANT 启用 Qt 集成支持
VTK_MODULE_ENABLE_VTK_RenderingOpenGL2 STRING WANT 启用 OpenGL 渲染
CMAKE_INSTALL_PREFIX PATH /usr/local 自定义安装路径
VTK_WRAP_PYTHON BOOL ON 启用 Python 绑定

如需要开启openMP并行,需要安装 yum install openmpi-devel

⚙️ 步骤 1:验证安装路径

# 查找命令实际位置
ls /usr/lib64/openmpi/bin/mpicc   # OpenMPI 路径
ls /usr/lib64/mpich/bin/mpicc     # MPICH 路径
若找到文件(例如 /usr/lib64/openmpi/bin/mpicc),则确认路径为:
/usr/lib64/openmpi/bin/

⚙️ 步骤 2:永久添加环境变量

# 编辑用户配置文件
echo 'export PATH=$PATH:/usr/lib64/openmpi/bin' >> ~/.bashrc

# 立即生效
source ~/.bashrc

cmake  -DCMAKE_INSTALL_PREFIX=/opt/vtk9.3 -DBUILD_SHARED_LIBS:BOOL=ON -DVTK_GROUP_ENABLE_QT:STRING="WANT" -DVTK_SMP_IMPLEMENTATION_TYPE="OpenMP" -DVTK_USE_MPI=ON -DVTK_MODULE_ENABLE_VTK_GuiSupportQtQuick:STRING="DONT_WANT" -DVTK_GROUP_ENABLE_MPI=YES -DVTK_BUILD_TESTING=OFF  ..

///同时生成release和debug版本
cmake -G "Ninja Multi-Config" -DCMAKE_INSTALL_PREFIX=/opt/vtk9.3 -DBUILD_SHARED_LIBS=ON -DVTK_GROUP_ENABLE_QT:STRING="WANT" -DVTK_SMP_IMPLEMENTATION_TYPE="OpenMP" -DVTK_USE_MPI=ON -DVTK_MODULE_ENABLE_VTK_GuiSupportQtQuick:STRING="DONT_WANT" -DVTK_GROUP_ENABLE_MPI=YES -DVTK_BUILD_TESTING=OFF ..

如果报错 
CMake Warning:
  Manually-specified variables were not used by the project:

    VTK_GROUP_ENABLE_QT
    VTK_MODULE_ENABLE_VTK_GuiSupportQtQuick

可以运行 which qmake
export  CMAKE_PREFIX_PATH="/opt/truck/qt/publish/lib/cmake"
并且注意 cmake指令中 -DVTK_GROUP_ENABLE_QT:STRING="WANT" 有引号

3. 高级模块定制

# 禁用不需要的模块(加速编译)
cmake \
  -DVTK_MODULE_ENABLE_VTK_IOGeoJSON:STRING=DONT_WANT \
  -DVTK_MODULE_ENABLE_VTK_IOVideo:STRING=DONT_WANT \
  ..

💡 配置验证技巧
使用 ccmake .. 交互界面检查配置状态(所有选项应为白色无报错)


四、编译与安装

1. 多线程编译

# 根据 CPU 核心数优化并行任务
export NPROC=$(nproc)
ninja -j${NPROC} 

2. 安装到系统目录

sudo ninja install
# 设置动态库路径
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/vtk.conf
sudo ldconfig

⚠️ 编译问题排查

  • 内存不足时减少线程数:ninja -j2
  • 出现 Qt 相关错误时检查 -DVTK_QT_VERSION=5

五、集成到项目

1. CMake 集成示例

cmake_minimum_required(VERSION 3.20)
project(VTK_Project)

# 添加 VTK 查找路径
list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/vtk-9.3")

find_package(VTK REQUIRED COMPONENTS
  CommonCore
  GuiSupportQt
  RenderingOpenGL2
)

include(${VTK_USE_FILE})
add_executable(vtk_app main.cpp)
target_link_libraries(vtk_app PRIVATE ${VTK_LIBRARIES})

2. qmake 集成示例

# Qt 项目文件 (.pro)
INCLUDEPATH += /usr/local/include/vtk-9.3
LIBS += -L/usr/local/lib -lvtkCommonCore-9.3 -lvtkGUISupportQt-9.3

🔧 QWidget 初始化代码

#include <QVTKOpenGLNativeWidget.h> // VTK 9.3+ 使用此头文件
QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(parent);

六、测试验证

1. 基础功能测试

// test_vtk.cpp
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>

int main() {
  auto sphere = vtkSmartPointer<vtkSphereSource>::New();
  sphere->SetRadius(5.0);
  sphere->Update();
  return 0;
}

编译命令:

g++ test_vtk.cpp -o test -lvtkCommonCore-9.3
./test

2. Qt 集成测试

// qt_vtk.cpp
#include <QApplication>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>

int main(int argc, char** argv) {
  QApplication app(argc, argv);
  QVTKOpenGLNativeWidget widget;
  vtkNew<vtkGenericOpenGLRenderWindow> window;
  widget.setRenderWindow(window);

  // 创建场景
  vtkNew<vtkSphereSource> sphere;
  vtkNew<vtkPolyDataMapper> mapper;
  mapper->SetInputConnection(sphere->GetOutputPort());
  vtkNew<vtkActor> actor;
  actor->SetMapper(mapper);
  vtkNew<vtkRenderer> renderer;
  renderer->AddActor(actor);
  window->AddRenderer(renderer);

  widget.show();
  return app.exec();
}

验证成功标志
应显示带光照的 3D 球体,旋转视图无渲染错误


七、高级主题

1. 自定义模块开发

在 CMake 中启用模块开发支持:

cmake -DVTK_BUILD_ALL_MODULES=ON -DVTK_MODULE_ENABLE_VTK_MyModule=WANT ..

2. 交叉编译配置

cmake -DCMAKE_TOOLCHAIN_FILE=../arm-toolchain.cmake \
  -DVTK_USE_X=OFF \
  -DVTK_OPENGL_USE_GLES=ON ..

📚 扩展学习资源


八、常见问题解决

问题现象 解决方案
GLX not found 安装 libglx-dev 并启用 -DVTK_OPENGL_HAS_GLX=ON
QVTKOpenGLWidget 无法渲染 调用 QSurfaceFormat::setDefaultFormat(QVTKOpenGLWidget::defaultFormat())
CMake 找不到 VTK 设置 -DVTK_DIR=/path/to/vtk-build
Python 绑定导入失败 设置 PYTHONPATH=/usr/local/lib/python3.x/site-packages

⚠️ 重要提示:VTK 9.3 已弃用 QVTKOpenGLWidget,统一使用 QVTKOpenGLNativeWidget

vtk静态库编译VTK9.3.0
build_linux.sh

rm -rf build_release
rm -rf /opt/vtk9.3
mkdir build_release
chmod -R 777 build_release
cd build_release
cmake -DCMAKE_INSTALL_PREFIX=/opt/vtk9.3 -DBUILD_SHARED_LIBS=OFF \
-DVTK_MODULE_ENABLE_VTK_ViewsQt:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_GUISupportQtQuick="WANT" \
-DVTK_MODULE_ENABLE_VTK_GUISupportQtSQL="WANT" \
-DVTK_MODULE_ENABLE_VTK_CommonCore="WANT" \
-DVTK_MODULE_ENABLE_VTK_CommonDataModel="WANT" \
-DVTK_MODULE_ENABLE_VTK_CommonExecutionModel="WANT" \
-DVTK_MODULE_ENABLE_VTK_FiltersExtraction="WANT" \
-DVTK_MODULE_ENABLE_VTK_FiltersParallelDIY2="WANT" \
-DVTK_MODULE_ENABLE_VTK_cgns:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_RenderingQt:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_RenderingParallel:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_RenderingParallelLIC:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_ParallelCore:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_ParallelDIY:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_IOParallel:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_IOParallelExodus:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_IOParallelLSDyna:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_IOParallelNetCDF:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_IOParallelXML:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_IOVideo:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_IOMovie:STRING="WANT" \
-DVTK_MODULE_ENABLE_VTK_GUISupportQt=YES \
-DVTK_QT_VERSION=5 -DVTK_RELOCATABLE_INSTALL=YES -DVTK_REPORT_OPENGL_ERRORS=YES \
-DVTK_USE_64BIT_IDS=YES \
-DVTK_SMP_ENABLE_SEQUENTIAL=YES \
-DVTK_SMP_ENABLE_STDTHREAD=YES \
-DVTK_VERSIONED_INSTALL=YES \
-DVTK_USE_64BIT_IDS=YES \
-DVTK_SMP_IMPLEMENTATION_TYPE="OpenMP" -DVTK_USE_MPI=ON \
-DVTK_GROUP_ENABLE_MPI=YES -DVTK_BUILD_TESTING=OFF ..

make -j 64
make install


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容