MacOS环境下SPheno-4.0.5编译时make命令执行失败问题排查
从你给出的错误信息来看,核心问题是macOS自带的BSD版本ar工具不兼容SPheno-4.0.5源码中默认的GNU ar命令语法。
错误原因分析
你看到的报错:
/Library/Developer/CommandLineTools/usr/bin/ar: illegal option -- .
是因为执行了这条命令:
ar ../lib/libSPheno.a Control.o
这是GNU ar的简化写法(省略了r选项,GNU ar会默认执行添加/替换操作),但macOS系统自带的是BSD版本的ar,它要求必须明确指定操作选项(比如r表示将目标文件添加到归档),不允许省略选项直接跟上归档文件名,所以才会触发报错。
而你之前的SPheno-4.0.4能正常编译,大概率是因为当时的src/Makefile中ar命令是带选项的,或者你当时的环境中优先使用了GNU版本的ar。
两种可行的解决方案
方案1:切换到GNU版本的ar工具
你已经通过Homebrew安装了GCC 11.2.0,Homebrew同时也提供了GNU版本的binutils工具集(包含GNU ar)。你只需要把GNU binutils的路径加到环境变量PATH的最前面,让系统优先使用GNU版本的工具:
- 打开终端,执行以下命令临时生效:
export PATH="/usr/local/opt/binutils/bin:$PATH" - 回到SPheno-4.0.5的目录,重新执行
make即可。
如果想让这个设置永久生效,可以把上面的命令添加到你的~/.bash_profile或~/.zshrc文件中(根据你使用的shell选择)。
方案2:修改src/Makefile中的ar命令
直接修改SPheno源码目录下src/Makefile里的ar调用语句,适配BSD ar的语法:
- 打开
src/Makefile,找到所有调用ar的行,比如你报错的这行:ar ../lib/libSPheno.a Control.o - 在
ar后面加上r选项(表示将目标文件添加/替换到归档中),修改为:ar r ../lib/libSPheno.a Control.o - 如果还有其他类似的
ar调用(比如批量添加目标文件到归档的命令),都需要加上对应的选项,比如ar rcs(c表示创建新归档,s表示生成索引),确保符合BSDar的语法要求。
修改完成后,回到顶层目录重新执行make即可正常编译。
补充说明
你提到复制SPheno-4.0.4的顶层Makefile还是报错,这是因为顶层Makefile只是负责调用src目录下的Makefile,真正控制编译流程的是src/Makefile,所以问题的根源在src目录的配置文件里。
内容的提问来源于stack exchange,提问作者PensoGlide

