GCC 4.8.5编译forpy_mod.F90报错 寻求问题原因及解决方案
问题根因
你遇到的所有编译报错均由GNU Fortran 4.8.5版本过旧导致:forpy依赖大量Fortran 2003/2008标准特性,而2015年发布的GCC 4.8.x对这类新特性的实现极不完善,具体对应报错逻辑如下:
Deferred-length character component 'doc_string' is not yet supported:延迟长度字符指针是Fortran 2003标准特性,GCC 4.8.x不支持在自定义类型中定义该类成员,直到GCC 5.x版本才完整支持该特性。- 所有
c_loc相关报错:旧版gfortran对ISO_C_BINDING模块的c_loc函数实现存在多处限制,无法处理假设形状数组、长度大于1的字符参数等合法入参,该问题在GCC 5及以上版本中已被修复。
修复方案
方案1(优先推荐):升级GNU Fortran版本
至少将gfortran升级到5.4以上,优先选择7.x/8.x/9.x这类稳定的长期支持版本,兼容性最好。
若你使用的是CentOS/RHEL系列系统,无需替换系统默认gcc,可通过devtoolset工具集安装隔离的新版gcc:
- 安装devtoolset对应版本源,比如devtoolset-9
- 执行
scl enable devtoolset-9 bash临时激活新版gcc环境 - 重新执行forpy的编译命令即可,不会影响系统其他软件的运行。
编译forpy时注意补充Python头文件和库路径参数,避免后续链接错误:
# 编译命令补充Python头文件路径 gfortran -c forpy_mod.F90 -I$(python -c "import sysconfig; print(sysconfig.get_path('include'))") # 后续链接时补充Python动态库路径 gfortran 你的业务代码.o forpy_mod.o -o 可执行文件 -L$(python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))") -lpython3.8
方案2(不推荐,仅当无法升级编译器时使用)
降级使用forpy的v1.1.x及更早的旧版本,该版本做了旧版gfortran适配,但会缺失部分新特性,且需要额外适配Python 3.8的兼容性问题。
内容的提问来源于stack exchange,提问作者zw4
相关产品推荐
相关产品推荐

