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规范(推荐)
- 编辑
ssivel.f08,将第12行的初始化语句中移除velsq:
! 修改前 data sumx, sumy, sumz, velsq /4*0.d0/ ! 修改后 data sumx, sumy, sumz /3*0.d0/
- 编辑
block_data.f08,在初始化语句中添加rl(23)(也就是velsq)的0值初始化,可在现有data语句中修改,也可单独加一行:
! 单独添加一行即可 data rl(23) /0.d0/
- 用原有命令重新编译即可
方案2:添加编译参数兼容老版本Fortran行为
GNU Fortran 10及以上版本默认开启-fno-common,严格禁止全局符号重复定义,你可以添加-fcommon参数回到老版本的兼容模式,自动合并重复的公共块符号:
gfortran -fcommon -L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib *.f08
内容的提问来源于stack exchange,提问作者Gues
相关产品推荐
相关产品推荐

