CMake配合gfortran编译Fortran项目时自定义宏未生效问题排查
Fortran项目自定义宏不生效问题解决方案
核心根因(概率最高)
你项目中集成了Fypp预处理器,这类自定义Fortran预处理器会先于gfortran的内置C预处理器执行,默认会过滤/移除它不识别的标准CPP语法指令。
你写的#define hello call属于普通C预处理器语法,不是Fypp的合法宏定义格式,会在Fypp处理阶段被直接删除,导致最终传给gfortran的代码中已经不存在这个宏定义,自然无法触发替换。
你单独写的测试文件没有走项目的Fypp预处理流程,直接触发了gfortran的预处理器,所以宏可以正常生效。
解决方案(二选一即可)
- 改用Fypp原生宏语法:将
#define hello call替换为Fypp格式的宏定义:#:def hello() call #:enddef - 配置Fypp保留CPP指令:在CMake的Fypp调用参数中添加
--keep-preprocessor,让它把所有标准C预处理器指令原样保留,交给后续gfortran处理。
其他可能排查方向
- 你引入的自定义CMake模块
soulioUtils.cmake可能重写了Fortran编译规则,对src目录下的源文件单独覆盖了编译参数,移除了-cpp标志,可以手动在编译命令后加-E参数输出预处理器处理后的代码,确认宏是否存在。 - 检查宏定义的位置:如果宏定义写在了module内部,部分版本的gfortran预处理器可能不会识别,建议将所有宏定义放在文件最开头、
module声明之前。
内容的提问来源于stack exchange,提问作者rgrun
相关产品推荐
相关产品推荐

