我该如何编写一个setup.py文件来使用Python、pybind11和Mingw-w64编译C++扩展?

11

我目前正在尝试编写一个 'setup.py' 脚本,当用户安装 Python 包时,它会自动编译我的 C++ 扩展并与 'pybind11' 绑定。在 Windows 上,使用 'VS19 MSVC' 编译器可以轻松实现。但是我正在尝试让它能够在用户安装 'MinGW-w64' 的情况下也能正常运行。

以下是包文件:

**main.cpp**
#include <pybind11/pybind11.h> int add(int i, int j) { return i + j; } namespace py = pybind11; PYBIND11_MODULE(pybind11_example, m) { m.def("add", &add); }
**setup.py**

    from setuptools import setup, Extension
    import pybind11
    
    ext_modules = [
        Extension(
            'pybind11_example',
            sources = ['main.cpp'],
            include_dirs=[pybind11.get_include()],
            language='c++'
        ),
    ]
    
    setup(
        name='pybind11_example',
        ext_modules=ext_modules
    )

将这两个文件放在同一个文件夹中并从命令提示符中运行:

    python setup.py build
如果用户已经安装了VS19 MSVC编译器,则可以成功生成**pybind11_example.pyd**文件,可以通过Python运行进行测试。
    import pybind11_example as m
    print(m.add(1, 2))

但是如果用户安装了Mingw-w64编译器,则会出现错误提示需要安装Visual Studio 2015。

请注意,我可以使用Mingw-w64手动编译**main.cpp****pybind11_example.pyd**

    g++ -static -shared -std=c++11 -DMS_WIN64 -fPIC -I C:\...\Python\Python38\Lib\site-packages\pybind11\include -I C:\ ... \Python\Python38\include -L C:\ ... \Python\Python38\libs main.cpp -o pybind11_example.pyd -lPython38
有没有一种方法可以编写setup.py,以便如果用户有安装MinGW-w64编译器的Windows系统,在安装包时自动将main.cpp编译成pybind11_example.pyd,而不需要手动进行。

请查看这个问题的答案。他们试图解决相反的情况,即强制使用msvc而不是mingw,但是使用setup.cfg的方法可能会对您有所帮助。 - Pak Uula
1
这里中,答案演示了如何根据setup工具所做的选择指定命令行参数:如果是“MSVC”,则使用一组参数,如果是“MinGW”,则使用另一组。 - Pak Uula
1个回答

2
请查看这个问题的答案。他们试图解决相反的情况,强制使用msvc而不是mingw,但是通过setup.cfg的方法可能会有所帮助。
这里的答案中演示了如何根据setup工具的选择指定命令行参数:如果是msvc,则有一组参数,如果是mingw,则有另一组参数。
我认为第二种方法应该适合您的需求 - 无论安装哪种编译器,都可以使用正确的命令行来构建您的模块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接