【问题标题】:Error trying to compile C file: mkfifo: cannot create fifo 'stderr': Operation not supported尝试编译 C 文件时出错:mkfifo:无法创建 fifo 'stderr':不支持操作
【发布时间】:2021-02-27 14:10:12
【问题描述】:

我们正在尝试按照自述文件中的说明编译this。我必须说,我们根本不是 C 方面的专家,我们是 Web 开发训练营的学生,正在努力完成我们的最后一个项目。

它是一个命令行工具,可以计算多个天体的星历,你可以在readme文件的设置中看到,它需要从网上下载一些数据,然后编译。 一切都通过setup.sh 脚本完成。

所以,我们试过了:

  • 在 Windows 10 ubuntu WSL 终端中

如果我们输入$./setup$./prettymake,下载数据后会报错:

$mkfifo: cannot create fifo 'stderr': Operation not supported
$mkdir -p obj obj/argparse obj/coreUtils obj/ephemCalc obj/listTools obj/mathsTools obj/settings
cc -Wall -Wno-format-truncation -Wno-unknown-pragmas -g -c -I /mnt/d/reboot/ephemeris-compute-de430/src -O3 -D DEBUG=0 -D MEMDEBUG1=0 -D MEMDEBUG2=0 -fopenmp -D DCFVERSION=\"2.0\"  -D DATE=\"09/06/2019\"  -D PATHLINK=\"/\"  -D SRCDIR=\"/mnt/d/reboot/ephemeris-compute-de430/src/\" src/ephemCalc/constellations.c -o obj/ephemCalc/constellations.o

如果我们使用$sudo ./setup 执行此操作,打印的错误是:

$mkfifo: cannot create fifo 'stderr': Operation not supported
$cat: stderr: No such file or directory
$mkdir -p obj obj/argparse obj/coreUtils obj/ephemCalc obj/listTools obj/mathsTools obj/settings
cc -Wall -Wno-format-truncation -Wno-unknown-pragmas -g -c -I /mnt/d/reboot/ephemeris-compute-de430/src -O3 -D DEBUG=0 -D MEMDEBUG1=0 -D MEMDEBUG2=0 -fopenmp -D DCFVERSION=\"2.0\"  -D DATE=\"09/06/2019\"  -D PATHLINK=\"/\"  -D SRCDIR=\"/mnt/d/reboot/ephemeris-compute-de430/src/\" src/ephemCalc/constellations.c -o obj/ephemCalc/constellations.o
  • 在 macOS 终端中

如果我们输入$./prettymake,会报错:

$mkdir -p obj obj/argparse obj/coreUtils obj/ephemCalc obj/listTools obj/mathsTools obj/settings
cc -Wall -Wno-format-truncation -Wno-unknown-pragmas -g -c -I /Users/rominaelorrietalopez/Documents/Descargas2/ephemeris-compute-de430-master/src -O3 -D DEBUG=0 -D MEMDEBUG1=0 -D MEMDEBUG2=0 -fopenmp -D DCFVERSION=\"2.0\"  -D DATE=\"09/06/2019\"  -D PATHLINK=\"/\"  -D SRCDIR=\"/Users/rominaelorrietalopez/Documents/Descargas2/ephemeris-compute-de430-master/src/\" src/argparse/argparse.c -o obj/argparse/argparse.o
$clang: error: unsupported option '-fopenmp'
$make: *** [obj/argparse/argparse.o] Error 1

我们尝试了某些无济于事的事情,例如授予权限等等,但不知道下一步该做什么。

好像和prettymake文件有关:

mkfifo stderr
cat stderr | sed 's/\(.*\)/\1/' &
make $@ 2>stderr | sed 's/\(.*\)/\1/'
rm stderr

这就像它试图创建一个管道来保存编译的错误但不知何故它失败了。 还可能值得一提的是,它有一个关联的 Makefile。

由于 github 项目没有问题,我们已经通过电子邮件联系了创建者,但是我们认为也许有人可以在这里帮助我们。

任何形式的帮助都将不胜感激,谢谢。

【问题讨论】:

  • “MAC ubuntu 终端”是指 macOS 终端应用程序(与 Ubuntu Linux 没有特别的关系)吗?
  • 我看不出prettymake 的意义。对我来说,这只是make 2>&1 的一种过于复杂的形式。只需使用make
  • @GiovanniZaccaria 测试,在 windows WSL 中它给出了相同的错误,mkfifo: cannot create fifo 'abcd': Operation not supported,在 mac 作品中。
  • 使用 WSL2,或设置 Linux 虚拟机。
  • WSL 对mkfifo 的支持显然有点粗糙。例如,请参阅github.com/microsoft/WSL/issues/3195。我同意@prog-fh 的观点,即prettymake 脚本看起来毫无意义,而且一个简单的make 2>&1 在几乎所有方面都会更好(包括不使用mkfifo)。由于包的setup 脚本可能运行prettymake,最简单的方法可能是将后者的内容替换为上述make 2>&1

标签: c bash windows-subsystem-for-linux


【解决方案1】:

来自 OP 的评论邀请我回答;在这里。

prettymake 脚本创建一个命名的先进先出,以便接收make 在其标准错误时生成的消息。 后台进程 (cat) 使用来自此 fifo 的数据并将它们发送到 sed 命令(见后文),以便在写入标准输出之前转换这些数据。 (请注意,cat 在这里没有用处,因为 sed 可以直接从命名的 fifo 中读取,这要归功于 <

但是,问题中显示的两个sed 命令不执行任何操作,因为它们只是捕获每一行文本(\(.*\))并原样重复它们(\1),因此它们可以被省略. 在这种情况下,脚本可能只包含make $@ 2>&1,它会产生相同的效果。 在创建命名 fifo 存在问题的系统上(显然是旧版本的 WSL),脚本中的这种更改应该会产生与预期相同的效果。

查看问题中提供的link,我们可以看到原来的prettymake脚本实际上在sed命令中包含了转换,以便以不同的方式显示make命令的标准输出和标准错误颜色。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多