Linux Mint编译仿真程序时遭遇-flto=选项参数不识别及MPI链接错误
Linux Mint编译仿真程序时遭遇-flto=选项参数不识别及MPI链接错误
看起来你碰到了两个关联的编译问题:LTO(链接时优化)参数的重复传递错误,以及注释参数后出现的MPI符号链接失败。我来帮你一步步拆解解决:
首先解决-flto=参数不识别的问题
报错里的unrecognized argument to ‘-flto=’ option: ‘auto -ffat-lto-objects -flto=auto’,本质是MPI编译选项里重复传递了LTO参数,导致编译器把-flto=auto后面的整个字符串当成了-flto=的参数值,自然无法识别。
你不需要直接注释掉整个MPI编译选项,而是要清理掉重复的参数:
- 打开
CMakeCache.txt,找到MPI_C_COMPILE_OPTIONS,把原来的:
修改为:MPI_C_COMPILE_OPTIONS:STRING=-flto=auto;-ffat-lto-objects;-flto=autoMPI_C_COMPILE_OPTIONS:STRING=-flto=auto;-ffat-lto-objects - 再找到
MPI_Fortran_COMPILE_OPTIONS,原来的参数里重复了好几次-flto=auto;-ffat-lto-objects,把它简化为:MPI_Fortran_COMPILE_OPTIONS:STRING=-ffile-prefix-map=/build/mpich-0xgrG5/mpich-4.0=.;-flto=auto;-ffat-lto-objects;-fallow-invalid-boz;-fallow-argument-mismatch
这样既保留了MPI编译需要的必要参数,又去掉了重复的LTO选项,避免编译器混淆。
然后解决注释参数后出现的undefined reference to 'ompi_mpi_*'错误
你注释掉MPI编译选项后出现链接错误,是因为编译器失去了MPI库的链接指引——这些ompi_mpi_*符号都是MPICH库提供的,没有正确配置编译选项的话,编译器不知道要去链接MPI的库文件,自然找不到这些符号。
修正完CMakeCache.txt的参数后,按以下步骤重新编译:
- 先清理之前的编译产物:
make clean - 重新生成正确的Makefile(如果你的项目是在单独的build目录,就把
.换成源码目录的路径,比如cmake ..):cmake . - 再次执行编译:
make
额外排查点(如果还是有链接错误)
如果修正后还是出现MPI符号未定义的问题,可以试试这些方法:
- 确认你的项目
CMakeLists.txt里正确配置了MPI:要包含find_package(MPI REQUIRED),并且针对C和Fortran代码添加include_directories(${MPI_INCLUDE_PATH}),链接时加上${MPI_C_LIBRARIES}和${MPI_Fortran_LIBRARIES}。 - 直接用MPI自带的编译器来编译:在运行CMake时指定MPI编译器,比如:
这样CMake会自动处理MPI的头文件和库链接,减少配置出错的概率。cmake -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 .
备注:内容来源于stack exchange,提问作者syglon
相关产品推荐
相关产品推荐

