Distutils 正在尝试使用 gcc 和 clang 选项 -arch x86_64 编译模块。
这不是一个铿锵的选择;在 clang 存在之前,它已经在 gcc 中多年了。
问题是我从 macports 安装了 gcc,所以 gcc 不仅仅是一个到 clang 的链接。
gcc 从不只是指向clang 的链接,除非你真的在你的 Mac 上做了一些奇怪的事情。特别是,如果您安装了包含 MacPorts 所需的 Xcode 命令行工具,您将拥有一个 /usr/bin/gcc,它是指向 gcc-4.2 或 llvm-gcc-4.2(或 gcc-4.0 或更早版本)的链接。很快有一天,Apple 将放弃对llvm-gcc 的支持,并且根本不会有任何名为gcc 的东西。**
我可以使用 CC='clang' ./setup.py build_ext 来编译模块,但这在分发模块方面感觉有点麻烦
该模块显然想用gcc 构建,这意味着Apple 的/usr/bin/gcc。
正如MacPorts documentation 所解释的那样,依赖gcc 成为任何特定的编译器几乎总是一个坏主意。
但是,在这种情况下,Python 这样做是有意义的。 Python 会记住用于构建它的编译器,以及相同的编译器设置等,因此可以确定 distutils 将构建它可以实际使用的模块。所以,如果它是用 /usr/bin/gcc 和-arch x86_64 构建的,那么它将尝试使用它来构建模块。您可以运行 python-config 工具(您的每个 Python 安装都有自己的,因此请确保您运行正确的工具)以查看它想要的确切内容。
您几乎总是可以用 Apple 的 clang 代替 Apple 的 gcc-4.2。但是替换一些甚至不支持相同选项的其他随机编译器?那是行不通的。
如果你想用 MacPorts 构建 Python 模块,你几乎肯定想用 MacPorts 构建 Python 本身,而不是使用一些预编译的二进制安装程序。最重要的是,您可能希望将端口用于任何具有它们的 Python 模块,而不是手动构建它们,因为其中许多需要变通方法才能与 MacPorts 一起使用。
另一方面,如果您打算构建非 MacPorts 软件(Python 模块或其他模块),那么您最好不要将 MacPorts gcc 放在 PATH 的顶部.几乎每一个configure/setup.py/etc。 ever write 将检测到您在 Mac 上,期望 gcc 是 Apple gcc,并传递 -arch 标志,依此类推。 (事实上,你会注意到甚至许多端口都明确需要 apple-gcc-4.2、llvm-gcc-4.2 或 clang,因为即使是 MacPorts 团队也无法让它们使用不同的编译器。你确定要试试?)
* ......这将是一个链接,例如,../llvm-gcc-4.2/bin/llvm-gcc-4.2,它本身将通过一个链接或存根包装器围绕i686-apple-darwin11-llvm-gcc-4.2......但这并不重要。
** 或者至少在 Xcode 5.0 测试版中时断时续。