You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac系统gfortran编译Fortran代码出现Duplicate Symbol重复符号错误

错误原因

你遇到的重复符号错误本质是命名公共块(Named Common Block)重复初始化导致的符号冲突,具体触发逻辑如下:

  • 两份代码中都定义了同名命名公共块/reals/,对应链接器报的重复符号_reals_
  • Fortran 标准明确规定:命名公共块的变量只能在BLOCK DATA单元中通过DATA语句初始化,禁止在普通子程序/函数中初始化公共块内的变量
  • 你在ssivel.f08的第12行通过data sumx, sumy, sumz, velsq /4*0.d0/初始化了velsq,而velsq通过等价语句(equivalence)关联到了/reals/公共块的rl(23),这相当于在ssivel编译单元中直接初始化了/reals/公共块
  • 同时block_data.f08中也对/reals/公共块的变量做了初始化,两个编译单元都生成了_reals_的全局符号定义,链接时就触发了重复符号错误
解决方法

有两种可行方案,任选其一即可:

方案1:修改代码符合Fortran规范(推荐)

  1. 编辑ssivel.f08,将第12行的初始化语句中移除velsq:
! 修改前
data sumx, sumy, sumz, velsq /4*0.d0/
! 修改后
data sumx, sumy, sumz /3*0.d0/
  1. 编辑block_data.f08,在初始化语句中添加rl(23)(也就是velsq)的0值初始化,可在现有data语句中修改,也可单独加一行:
! 单独添加一行即可
data rl(23) /0.d0/
  1. 用原有命令重新编译即可

方案2:添加编译参数兼容老版本Fortran行为

GNU Fortran 10及以上版本默认开启-fno-common,严格禁止全局符号重复定义,你可以添加-fcommon参数回到老版本的兼容模式,自动合并重复的公共块符号:

gfortran -fcommon -L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib *.f08

内容的提问来源于stack exchange,提问作者Gues

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:15:03