如何让gfortran将-march参数传递给预处理器生成架构宏?
gfortran预处理器无法获取架构特定宏的解决方法
问题场景
- 执行
echo | gfortran -march=tigerlake -dM -E -时,能正常输出__AVX__、__AVX512F__等架构相关预定义宏; - 但编译Fortran文件时,即使添加
-march=tigerlake -cpp参数,预处理器仍无法识别这些宏,导致条件分支逻辑不符合预期(如测试代码输出Has not AVX,而非预期的Has AVX)。
原因
gfortran通过-cpp启用C预处理器时,-march参数对应的架构宏不会自动传递给预处理器阶段,这是Fortran编译流程与gcc(C/C++)的差异点。
解决方案
1. 分离预处理与编译步骤
先单独完成预处理,确保-march参数传递给预处理器,再编译预处理后的文件:
# 生成包含架构宏的预处理文件 gfortran -E -cpp -march=tigerlake somecode.F90 -o somecode_pp.f90 # 编译预处理后的文件 gfortran -c somecode_pp.f90 -march=tigerlake
2. 使用-fpreprocessor强制传递参数
添加-fpreprocessor选项,让gfortran将所有编译参数(包括-march)传递给外部预处理器,确保宏被正确定义:
gfortran -c somecode.F90 -cpp -fpreprocessor -march=tigerlake
3. 手动定义宏(临时方案)
如果上述方法不适用,可手动指定需要的架构宏:
gfortran -c somecode.F90 -cpp -march=tigerlake -D__AVX__ -D__AVX512F__
内容的提问来源于stack exchange,提问作者Rasmus
相关产品推荐
相关产品推荐

