1

我正在尝试在 Linux 上为 Y86-64 代码编译一个模拟器。我已经重写了 makefile,但结果如下所示。它说“'matherr' 的未定义引用”。(看起来它在链接时与 gcc 连接)

(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5 ")
    make[1]: 进入目录“/home/gongchen/桌面/ICS/archlab-handout/sim/pipe”
    # Building the pipe-std.hcl version of PIPE
    ../misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
    gcc -Wall -O2 -I/usr/include/tcl8.5  -I../misc -DHAS_GUI -o psim psim.c pipe-std.c \
        ../misc/isa.c -L/usr/lib/ -ltk8.5 -ltcl8.5 -lm
    /tmp/cchKTZy7.o:(.data.rel+0x0):对‘matherr’未定义的引用
    collect2: error: ld returned 1 exit status
    Makefile:42: recipe for target 'psim' failed
    make[1]: *** [psim] Error 1
    make[1]: 离开目录“/home/gongchen/桌面/ICS/archlab-handout/sim/pipe”
    Makefile:28: recipe for target 'all' failed
    make: *** [all] Error 2
4

2 回答 2

3
gcc -Wall -O2 -I/usr/include/tcl8.5  -I../misc -DHAS_GUI -o psim psim.c pipe-std.c \
    ../misc/isa.c -L/usr/lib/ -ltk8.5 -ltcl8.5 -lm
/tmp/cchKTZy7.o:(.data.rel+0x0):对‘matherr’未定义的引用

您正在链接并收到未定义的引用错误matherr

它看起来像是matherrSVID 数学库的一部分。根据matherr(3)手册页,该符号不再存在于 Glibc 2.27 或更高版本中。

描述

注意:glibc 不再支持本页中描述的机制。在 glibc 2.27 之前,它已被标记为过时。自 glibc 2.27 起,该机制已被完全删除。新应用程序应使用 math_error(7) 和 fenv(3) 中描述的技术。此页面记录了 matherr() 机制,以帮助维护和移植旧应用程序。

math_error(7)手册页说您应该执行以下操作来检查错误:

  1. 设置errno为零
  2. 打电话feclearexcept(FE_ALL_EXCEPT)

数学计算完成后,您应该检查以下非零值以指示错误:

  1. errno
  2. fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW);

由于您是尝试使用该程序的男性或女性(而不是维护者),我建议采取两种行动。策略是使用一切正常的发行版,然后交给 Y86 维护者来修复它。

首先,使用提供 Glibc 2.26 或更早版本的不同的旧发行版。像 Debian 8 (Glibc 2.19) 或 Fedora 25 (Glibc 2.24) 这样的东西应该就可以了。

其次,针对 Y86 项目提交错误报告。Y86 维护人员需要解决问题,而不是学生试图学习课堂材料。

于 2018-10-20T08:45:18.323 回答
3

我的同学有办法解决这个问题:注释掉matherr相关的代码,就像图中的代码一样。并且 GUI 模式有效。好厉害! 在此处输入图像描述

于 2018-11-05T05:14:47.647 回答