我试图创建一个包含一些C代码和NumPy依赖关系的Python包,我认为使用numpy.distutils
将是实现这一目标的最简单方法。到目前为止,我有setup.py
个文件
from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration
from distutils.extension import Extension
ext_modules=[
Extension("test",
sources=["test.c"],
libraries=["gmp"],
)
]
configuration = Configuration(
package_name = "test",
ext_modules = ext_modules,
)
setup(**configuration.todict())
并在同一目录中清空test.c
。
但由于某种原因,它在编译期间添加了笨拙的-arch i386 -arch x86_64
标志(系统是Mac OS X),这导致
ld: warning: ignoring file /usr/local/lib/libgmp.dylib,
file was built for x86_64 which is not the architecture being linked (i386):
/usr/local/lib/libgmp.dylib
警告以及调用C函数时的其他问题。
如何解决这种问题?我能以某种方式指定目标架构吗?
UPD 即可。目前我只是做
ARCHFLAGS="-arch x86_64" python setup.py build_ext --inplace
但我希望在没有架构先验知识的情况下在任何平台上工作,以便我可以部署它。
答案 0 :(得分:1)
我不相信这些是由numpy.distutils
添加的distutils
本身。 distutils
从Python的构建方式中获取这些标志,在您的情况下,它构建为具有32位和64位体系结构的胖二进制文件。此信息来自$PREFIX/lib/python<version>/config/Makefile
文件。
对于构建具有二进制依赖关系的包必须处理的人来说,这是非常正常的事情。你不知道他们的Python是胖还是瘦,你也不知道他们是如何构建他们的libgmp.dylib
的。通过大量工作,您可以在setup.py
中编写一些代码来查找libgmp.dylib
,查询其架构,然后将distutils
配置为仅使用正确的标志(并且仍然正确)在没有必要的情况下进行操作,优雅地失败,等等。但是,通过简单地记录这可能会出现以及ARCHFLAGS=
解决方案,您可能会为您的开发工作获得更多的收获。