在OSX上将GCC添加到路径时编译Cython模块

2024-07-01 07:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用distutils来编译一个cython模块,它使用的是enthound Canopy的python版本;但是很明显gcc和clang之间存在混淆。Distutils正在尝试使用gcc和clang选项-arch x86_64编译模块。问题是我从macports安装了gcc,所以gcc不仅仅是到clang的链接。我可以使用CC='clang' ./setup.py build_ext来编译模块,但就模块的分发而言,这感觉有点粗糙。有什么我可以放进去的吗设置.py为了让它在这种设置下更健壮?我正在考虑在编译器标志中使用clang if-arch,但是我似乎找不到distutils到底从哪里获得编译器标志,或者如何告诉它使用特定的编译器。在


Tags: 模块py版本编译器标志选项x86cython
1条回答
网友
1楼 · 发布于 2024-07-01 07:27:36

Distutils is trying to compile the module using gcc and the clang option -arch x86_64.

这不是一个clang选项;在clang存在之前,它在gcc中存在了很多年。在

The problem is that I have gcc installed from macports, so gcc isn't just a link to clang.

gcc是一个指向clang的链接,除非你真的在你的Mac上做过一些奇怪的事情。特别是,如果您安装了包含MacPorts所需的Xcode命令行工具,那么您将拥有一个/usr/bin/gcc,它是指向gcc-4.2llvm-gcc-4.2(或gcc-4.0或更早版本)的链接。很快的一天,苹果将放弃对llvm-gcc的支持,而且根本没有所谓的gcc.**

I can get the module to compile using CC='clang' ./setup.py build_ext, but this feels a little hacky in terms of distributing the module

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

依赖gcc作为任何特定的编译器几乎总是一个坏主意,MacPorts documentation解释道。在

但是,在本例中,Python这样做是有意义的。Python会记住用于构建它的编译器,以及相同的编译器设置,等等,因此它可以确保distutils将构建它可以实际使用的模块。因此,如果它是用/usr/bin/gcc和-arch x86_64构建的,那么它将尝试使用它来构建模块。您可以运行python-config工具(每个Python安装都有自己的工具,因此请确保您运行的是正确的)来查看它到底想要什么。在

用苹果的叮当声代替苹果的gcc-4.2,你几乎总能逃脱惩罚。但是替换其他一些甚至不支持相同选项的随机编译器呢?那是行不通的。在


如果您想用MacPorts构建Python模块,那么您几乎肯定希望用MacPorts构建Python本身,而不是使用一些预编译的二进制安装程序。除此之外,您可能希望将端口用于任何具有端口的Python模块,而不是手动构建它们,因为它们中的许多模块都需要解决方法才能使用MacPorts。在

另一方面,如果您计划构建非MacPorts软件Python模块或其他方法,那么将MacPorts gcc放在路径上的最上面会更好。几乎所有配置/setup.py/etc。ever writed将检测到您在Mac上,期望gcc是Applegcc,并传递-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的链接或存根包装器来实现……但这并不重要。在

**或者至少在Xcode5.0Betas中是正确的。在

相关问题 更多 >

    热门问题