我成功在Linux上使用MinGW构建了一些DLL,这些DLL对于我的Python扩展非常必要。大致如下:
from setuptools.command.build_py import build_py
class BuildGo(build_py):
def run(self):
if # need to build windows binaries
self.build_win()
build_py.run(self)
def build_win(self):
if # compilers and toolchain available
try:
# builds extra libraries necessary for this extension
except subprocess.CalledProcessError as e:
print(e.stderr)
raise
try:
result = subprocess.check_output([
'x86_64-w64-mingw32-gcc-win32',
'-shared',
'-pthread',
'-o',
EXTRA_DLL,
FAKE_WIN_BINDINGS,
ARCHIVE_GENERATED_IN_PREVIOUS_STEP,
'-lwinmm',
'-lntdll',
'-lws2_32',
])
print(result)
except subprocess.CalledProcessError as e:
print(e.stderr)
raise
我现在希望能够避免像之前那样痛苦地扩展`build_ext`,以便在Windows上交叉编译Cython代码... 我研究了“setuptools、distutils和cython的优雅相互作用”的深渊,但在深渊有机会回头看我的时候...是否有一种方式只需指定一些标志,比如所需平台的编译器名称和Python二进制文件名,然后它就可以自动完成呢?
我读了这篇文章:http://whatschrisdoing.com/blog/2009/10/16/cross-compiling-python-extensions/ - 它已经快10年了。它让我想哭...自那以后有什么变化吗?或者这些步骤更多或更少是我必须为除了我正在运行的平台之外的平台进行编译的步骤吗?
还是说,有一个在网上的示例项目可以做到这一点吗?
目标
我的终极目标是生成一个egg包,其中包含PE和ELF二进制文件,并在安装时通过pip或pipenv将它们正确地安装在任一平台上的正确位置。它应该在Linux上编译(在MS Windows上编译它并不必要)。