【问题标题】:Compiling C floating point arithmetic on OSX for Shewchuk's Triangle program在 OSX 上为 Shewchuk 的 Triangle 程序编译 C 浮点运算
【发布时间】:2011-01-22 07:59:30
【问题描述】:

This question 建议对带孔的多边形进行三角剖分的最佳方法是使用Shewchuk's Triangle library,但我无法在我的 mac OSX 上编译它。这是一个非常流行的程序,已经存在了一段时间,因此应该比较容易编译,我只是对 C 缺乏经验。

这是我得到的错误:

$ make
cc -O -DLINUX -I/usr/X11R6/include -L/usr/X11R6/lib -o ./triangle ./triangle.c -lm
Undefined symbols:
  "__FPU_SETCW", referenced from:
   _exactinit in ccrEJvxc.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [triangle] Error 1

我正在尝试注释掉某些标志(即#define LINUX 等),但每种组合都会出现一组不同的错误。

有人可以逐步指导我如何在 Mac 上编译(并可能调用)这个程序吗?

【问题讨论】:

  • 我记得,三角形的精确算术算法需要对浮点控制字进行非常特殊的处理。 __FPU_SETCW 符号表示使用 8087 FPU。我相信代码是相对简单的 C 代码(顺便说一下,它不是 C++),如果这不是您唯一的障碍,我会感到惊讶。我建议您查阅 Mac C 编译器文档以了解控制 FP 操作(舍入控制、下溢控制、异常掩码等)的方法
  • 我想你会在xmmintrin.h 中找到你需要的选项。您需要从 8087 setcw 映射到 SSE 等效项。显然您可以禁用 SSE 并在 Mac 上强制使用 8087,但这对我来说听起来不是正确的方法。
  • 我正在查看xmmintrin.h,但它根本不包含__FPU_SETCW 或任何提及FPU。你是说我必须添加一些行吗?
  • 不,它不包含 FPU_SETCW。您首先需要了解 8087 控制字设置,然后将其映射到 SSE 中的等效项,如 xmmintrin.h 中所示。

标签: c macos compilation


【解决方案1】:

我设法在 OS X 上进行编译,方法是从 makefile 中 CSWITCHES 的定义中删除 -DLINUX 标志,因为 fpu_control.h 似乎是特定于 linux 的。

【讨论】:

    【解决方案2】:

    我不认为这是标准功能,无论如何我相信 Mac .. 使用英特尔架构的 SSE 之后 .. 从来没有理由支持 387 式 FPU 操作。

    所以您的代码是特定于 Linux 的。您可以删除 linux 特定代码或实现其入口点的无操作版本。

    我自己不会这样做,但你可能会逃脱:

    $ cat > /usr/include/fpu_control.h
    
    #define _FPU_SETCW(cw) // nothing
    #define _FPU_GETCW(cw) // nothing
    

    不用担心 null 实现。您无需调整 FPU 异常和舍入模式。

    【讨论】:

    • 感谢您的快速回复。我遇到了同样的错误。也许这不是 fpu_control.h 文件所属的地方?
    • triangle 在 Windows 上编译,所以它不是 Linux 特定的
    • 为了正确操作三角形,确实需要小心控制 FPU 异常和舍入模式。这就是代码中存在此代码的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2021-02-20
    • 2013-06-23
    相关资源
    最近更新 更多