gfortran编译受当前目录名为as的可执行文件干扰问题求证
问题原因与验证结论
这个问题的本质是Shell的PATH搜索优先级问题,不是gfortran本身的设计缺陷,不同环境是否复现完全取决于系统的PATH配置:
- 若当前环境的PATH中,当前目录(
.)的排序早于系统二进制路径(如/usr/bin、/usr/local/bin),必然会复现该问题。gfortran编译的汇编阶段需要调用系统自带的as汇编器,此时Shell会优先匹配到当前目录下的同名可执行文件,调用后无法生成有效的汇编目标文件,最终触发链接报错 - 绝大多数主流Linux发行版、macOS的默认PATH配置不会将
.加入PATH,或仅将其放在PATH末尾,这种场景下不会触发该问题 - 不建议在PATH中优先配置当前目录,这类配置有极大的安全风险,也容易触发类似的工具调用冲突
原问题复现步骤
以下是在GNU Fortran (GCC) 11.1.0、macOS Big Sur 11.5.2环境下的复现操作:
lord@rabbit ~ % alias gf gf='/usr/local/bin/gfortran ' lord@rabbit ~ % alias as lord@rabbit ~ % more as.f
as.f代码内容:
program as print*,'this is program _as_ executing!' end
后续操作:
lord@rabbit ~ % ls -lt as ls: as: No such file or directory lord@rabbit ~ % gf -o as as.f lord@rabbit ~ % ./as this is program as executing! lord@rabbit ~ % more hello.f
hello.f代码内容:
program helloworld print*,'hello' end
后续编译操作:
lord@rabbit ~ % gf -o hello hello.f this is program as executing! ld: file too small (length=0) file '/var/folders/dz/qjjbfdzs663fd6jmv27hcz300000gn/T//cc4edAsr.o' for architecture x86_64 collect2: error: ld returned 1 exit status lord@rabbit ~ % rm as lord@rabbit ~ % gf -o hello hello.f lord@rabbit ~ % ./hello hello
内容的提问来源于stack exchange,提问作者Steve Lord
相关产品推荐
相关产品推荐

