0

我正在尝试使用 distutils 使用 Enthought Canopy 的 python 版本编译 cython 模块;但是很明显 gcc 和 clang 之间存在混淆。Distutils 正在尝试使用gcc和 clang 选项编译模块-arch x86_64。问题是我从macports 安装了gcc,所以gcc 不仅仅是clang 的链接。我可以使用 编译模块CC='clang' ./setup.py build_ext,但这在分发模块方面感觉有点笨拙。我可以在 setup.py 中添加一些东西以使其在这种设置下更加健壮吗?如果 -arch 在编译器标志中,我正在考虑使用 clang,但我似乎无法找到 distutils 究竟在哪里获取编译器标志,或者如何告诉它使用特定的编译器。

4

1 回答 1

2

Distutils 正在尝试使用 gcc 和 clang 选项 -arch x86_64 编译模块。

这不是一个铿锵的选择。在 clang 存在之前,它在 gcc 中已经存在多年了。

问题是我从macports 安装了gcc,所以gcc 不仅仅是clang 的链接。

gcc不仅仅是一个链接,除非clang你真的在你的 Mac 上做了一些奇怪的事情。特别是,如果您安装了包含 MacPorts 所必需的 Xcode 命令行工具,您将拥有一个/usr/bin/gcc指向gcc-4.2or llvm-gcc-4.2gcc-4.0或更早版本)的链接。很快有一天,Apple 将放弃对 的支持llvm-gcc,并且根本不会调用任何东西gcc。**

我可以使用 CC='clang' ./setup.py build_ext 来编译模块,但这在分发模块方面感觉有点笨拙

该模块显然想用 构建gcc,这意味着 Apple 的 /usr/bin/gcc。

正如MacPorts 文档所解释的,依赖于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 模块或其他软件——你最好不要将 MacPortsgcc放在 PATH 上。几乎每一个configure/setup.py/etc。everwritten 将检测到您在 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 测试版中时断时续。

于 2013-09-24T00:50:47.407 回答