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本身的编译配置,不会自动导入其他第三方库的路径。
解决步骤
- 删除废弃的VTK_USE_FILE配置:删除两个版本判断分支下
INCLUDE_DIRECTORIES中的${VTK_USE_FILE}参数,消除警告。 - 为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)
- 简化可执行文件配置:因为lib已经导出了所有公共依赖,可执行文件的链接逻辑可以简化为:
target_link_libraries(${PROJECT_NAME} PRIVATE lib)
- 清空缓存重新编译:删除build目录下的所有文件,重新执行
cmake -DCMAKE_BUILD_TYPE=Debug ..和make命令即可。
内容的提问来源于stack exchange,提问作者mehdi_bm
相关产品推荐
相关产品推荐

