修改求解器C、C++及Fortran编译器后安装报错求助
问题背景
修改求解器安装脚本install.sh,将编译器指定为NVHPC套件的nvfortran(Fortran)、nvc(C)、nvc++(C++)后,执行脚本触发CMake错误,提示No compile flags were found,报错溯源到SetCompileFlag.cmake的第109行。
问题排查
1. 编译标志检测逻辑缺陷
SetCompileFlag.cmake中针对Fortran编译器的错误匹配列表(FAIL_REGEX)未包含NVHPC编译器的错误提示格式。当脚本测试编译标志时,nvfortran输出的错误信息(如unrecognized command line option)不在预设的匹配规则里,导致即使标志有效,也会被误判为无效。
2. 预设编译标志不兼容NVHPC
项目的SetFortranFlags.cmake中传入的编译标志是针对GCC/Intel等编译器设计的(如-ffree-form、-ffree-line-length-none),这些标志nvfortran不支持,所有标志测试全部失败,触发REQUIRED级错误。
解决方法
方法一:更新错误匹配规则
编辑cmake/Modules/SetCompileFlag.cmake,在Fortran的FAIL_REGEX中添加NVHPC编译器的错误提示模式:
SET(FAIL_REGEX "ignoring unknown option" # Intel "invalid argument" # Intel "unrecognized .*option" # GNU "[Uu]nknown switch" # Portland Group "ignoring unknown option" # MSVC "warning D9002" # MSVC, any lang "[Uu]nknown option" # HP "[Ww]arning: [Oo]ption" # SunPro "command option .* is not recognized" # XL "unrecognized command line option" # NVHPC/nvfortran "warning: unknown option" # NVHPC/nvfortran )
方法二:添加NVHPC兼容的编译标志
编辑cmake/Modules/SetFortranFlags.cmake,找到调用SET_COMPILE_FLAG的位置,添加nvfortran支持的编译标志(如-Mfree对应GCC的-ffree-form,-fast对应优化选项):
示例修改(根据实际调用调整):
SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS "" Fortran REQUIRED "-fast -Mfree -Mextend" # NVHPC优化+自由格式+长行支持 "-fast -Mfree" # NVHPC优化+自由格式 "-O3 -ffree-form -ffree-line-length-none" # GCC/Intel "-O3 -ffree-form" # GCC/Intel )
方法三:直接强制指定编译标志(快速绕过检测)
修改install.sh中的cmake命令,直接传入NVHPC兼容的编译标志,跳过自动检测逻辑:
FC=nvfortran CC=nvc CXX=nvc++ cmake .. \ -DCMAKE_BUILD_TYPE=RELEASE \ -DCMAKE_Fortran_FLAGS_RELEASE="-fast -Mfree -Mextend" \ -DCMAKE_C_FLAGS_RELEASE="-fast" \ -DCMAKE_CXX_FLAGS_RELEASE="-fast"
前置检查
确保NVHPC编译器已正确安装并加入环境变量:
nvfortran --version nvc --version nvc++ --version
若命令无法执行,需先将NVHPC的bin目录添加到PATH中(如export PATH=/path/to/nvhpc/bin:$PATH)。
内容的提问来源于stack exchange,提问作者Flerovium 114

