Linux下CMake3.23.2编译VTK-9.2.0.rc1报ioss模块模板特化错误
问题根因
该报错出现在VTK 9.2.0.rc1自带的第三方ioss模块编译阶段,本质是代码不规范+高版本GCC语法检查收紧共同导致的:
头文件中broadcast系列模板函数定义在vtkioss_Ioss::ParallelUtils命名空间下,但源文件做模板特化时错误使用了Ioss::ParallelUtils命名空间,GCC 11及以上版本默认将跨命名空间模板特化的不规范写法判定为编译错误,直接中断构建,低版本GCC会将该问题降级为警告不影响编译。
解决方案
按操作成本从低到高排序,任选其一即可:
- 加编译参数绕过检查
重新执行CMake配置阶段,追加-fpermissive编译选项,将该类语法错误降级为警告:# 进入你之前创建的VTK build目录执行 cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-fpermissive" # 配置完成后重新编译 make -j$(nproc) - 直接修正源码命名空间错误
打开报错源文件:ThirdParty/ioss/vtkioss/Ioss_ParallelUtils.C
定位到423行、464行两处模板特化代码,将代码开头的Ioss::ParallelUtils::broadcast统一修改为vtkioss_Ioss::ParallelUtils::broadcast,保存后直接重新执行make -j$(nproc)即可,无需重新跑CMake配置。 - 关闭ioss模块编译
如果业务场景不需要使用VTK对IOSS格式的IO支持,CMake配置时追加参数关闭该模块即可跳过错误代码编译:cmake .. -DVTK_MODULE_ENABLE_VTK_ioss=NO make -j$(nproc)
内容的提问来源于stack exchange,提问作者charli
相关产品推荐
相关产品推荐

