编译多天体历计算命令行工具时遭遇mkfifo与-fopenmp错误求助
看起来你和团队在完成结业项目时遇到了两个不同环境的编译阻碍,我来一步步帮你拆解解决:
一、Windows WSL环境的mkfifo错误问题
问题根源
你碰到的mkfifo: cannot create fifo 'stderr': Operation not supported错误,核心原因是项目放在了挂载的Windows NTFS分区(比如你的/mnt/d/reboot/...路径)。NTFS文件系统不支持POSIX标准的命名管道(FIFO),而prettymake脚本里尝试创建名为stderr的FIFO来捕获编译错误,自然会失败。
可选解决方案
方案1:把项目迁移到WSL原生文件系统
WSL的原生目录(比如~/,对应Windows侧的\\wsl$\Ubuntu\home\你的用户名)是ext4格式,完全支持POSIX特性。执行以下步骤:
# 复制项目到WSL主目录 cp -r /mnt/d/reboot/ephemeris-compute-de430 ~/ # 进入新的项目目录 cd ~/ephemeris-compute-de430 # 重新执行安装编译脚本 ./setup.sh
方案2:修改prettymake脚本,移除FIFO依赖
原prettymake里的sed命令其实只是原样输出内容,没有做任何实际修改,完全可以简化成不需要FIFO的版本。打开prettymake文件,替换成以下内容:
make "$@" 2>&1 | sed 's/\(.*\)/\1/'
这个命令直接把标准错误重定向到标准输出,再通过sed(保留原脚本结构),彻底避开了创建FIFO的步骤,在NTFS分区也能正常运行。
二、macOS环境的-fopenmp编译错误问题
问题根源
macOS默认自带的Clang编译器不支持OpenMP(-fopenmp是OpenMP并行编译的专属选项),所以编译时会抛出clang: error: unsupported option '-fopenmp'的错误。
解决方案
需要安装支持OpenMP的Clang版本,推荐用Homebrew安装LLVM:
- 先安装Homebrew(如果还没安装):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - 安装包含OpenMP支持的LLVM:
brew install llvm - 在执行编译前,临时指定编译器为LLVM的Clang:
或者直接在命令行里一次性指定:export CC=/usr/local/opt/llvm/bin/clang export CXX=/usr/local/opt/llvm/bin/clang++ # 然后执行编译命令 ./prettymakeCC=/usr/local/opt/llvm/bin/clang ./prettymake
通用优化建议:直接使用原生Makefile
既然项目已经附带了标准Makefile,其实可以跳过prettymake,直接执行make命令,这样能避开prettymake带来的额外问题:
# 如果setup.sh的下载步骤已经完成,可跳过这一步 ./setup.sh # 直接用原生make编译 make
另外提醒:完全不需要用sudo ./setup执行编译操作,管理员权限不仅没必要,还可能导致文件权限混乱,后续更难排查问题。
内容的提问来源于stack exchange,提问作者Nox

