You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake编译含VTK/Eigen/PETSc/dealII的C++代码找不到vtkActor.h求助

错误原因

1. 警告原因

你使用的是VTK 9.0.3版本,该版本已经完全废弃了VTK_USE_FILE变量,该变量实际指向的是一个cmake脚本文件而非头文件目录,你将其加入INCLUDE_DIRECTORIES后,编译器会把文件路径当做目录搜索,就会触发not a directory的警告,同时会干扰正常头文件搜索逻辑。

2. 头文件找不到原因

你的源代码首先会被编译为lib静态库,之后才会链接到最终的可执行文件。但你仅将VTK、Eigen等依赖链接到了最终的可执行文件,没有给lib库配置对应的依赖:编译src/post_processing.cc属于lib库的编译阶段,此时还没有引入VTK的头文件搜索路径,自然找不到vtkActor.h。
另外deal.II的DEAL_II_SETUP_TARGET命令仅会自动引入deal.II本身的编译配置,不会自动导入其他第三方库的路径。


解决步骤

  1. 删除废弃的VTK_USE_FILE配置:删除两个版本判断分支下INCLUDE_DIRECTORIES中的${VTK_USE_FILE}参数,消除警告。
  2. 为lib库显式配置依赖:修改ADD_LIBRARY(lib ${LIB})后的代码段,给lib库绑定全部依赖,依赖的头文件路径会通过现代CMake的目标属性自动导入,不需要全局配置:
ADD_LIBRARY(lib ${LIB})
# 配置lib库的公开头文件路径,PUBLIC属性会自动将路径导出给链接lib的目标
target_include_directories(lib PUBLIC include ${PETSC_INCLUDE_DIRS})
# 给lib库链接全部依赖
target_link_libraries(lib PUBLIC
  Eigen3::Eigen
  ${VTK_LIBRARIES}
  ${PETSC_LINK_LIBRARIES}
)
vtk_module_autoinit(
  TARGETS lib
  MODULES ${VTK_LIBRARIES}
)
DEAL_II_SETUP_TARGET(lib)
  1. 简化可执行文件配置:因为lib已经导出了所有公共依赖,可执行文件的链接逻辑可以简化为:
target_link_libraries(${PROJECT_NAME} PRIVATE lib)
  1. 清空缓存重新编译:删除build目录下的所有文件,重新执行cmake -DCMAKE_BUILD_TYPE=Debug ..和make命令即可。

内容的提问来源于stack exchange,提问作者mehdi_bm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:24:04