如何用明文WW64、Python和pyBDN11构建手动C++扩展?

2024-06-11 07:52:27 发布

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

我的最终目标是从我的C++代码编译python C++扩展。目前,为了开始,我将遵循pybind11文档第一步中的一个简单示例。我的工作环境是Windows 7 Professional 64位、mingw-w64(x86_64-8.1.0-posix-seh-rt_v6-rev0)和带有Python 3.7.4 64位的Anaconda3。我有两个文件。第一个是C++文件——Expul.CPP

#include <pybind11/pybind11.h>

int add(int i, int j) {
    return i + j;
}

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function which adds two numbers");
}
< >我用以下命令编译C++文件:


C:/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe -shared -std=c++11 -DMS_WIN64 -fPIC -ID:\Users\ADAS\anaconda3\Include -ID:\Users\ADAS\anaconda3\Library\include -ID:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\include -Wall -LD:\Users\ADAS\anaconda3\Lib -LD:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\libs example.cpp -o example.dll -lPython37

编译结果是成功的,我得到了example.dll文件

在下一步中,我运行以下Python代码--example.py:

import example

def main():
    i, j = (1, 2)
    res = example.add(i, j)
    print("%d + %d = %d" % (i, j, res))

if __name__ == '__main__':
    main()

这里我有一个问题。看起来import example行没有给我任何警告或错误,但是res = example.add(i, j)行给了我一个错误:

AttributeError: module 'example' has no attribute 'add'

在Ubuntu18.04下,我成功地用Python编译并运行了上面的例子,但在我的办公室里,我只有Windows7

问题:我的设置或命令行中有什么错误?在Windows下,不改变当前的C++编译器(明文W64版本8.1),是否可以修复这个问题?p>


Tags: 文件代码addidincludemainexamplewindows
1条回答
网友
1楼 · 发布于 2024-06-11 07:52:27

真是难以置信!问题只是编译文件的文件扩展名。只要我将.dll更改为.pyd,Python示例(example.py)就可以正常运行了

因此,新的命令行是:

C:/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe -shared -std=c++11 -DMS_WIN64 -fPIC -ID:\Users\ADAS\anaconda3\Include -ID:\Users\ADAS\anaconda3\Library\include -ID:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\include -Wall -LD:\Users\ADAS\anaconda3\Lib -LD:\Users\ADAS\anaconda3\pkgs\python-3.7.4-h5263a28_0\libs example.cpp -o example.pyd -lPython37

因为我对命令行参数做了一些实验,所以我将再次检查所有编译器参数,以确保它给出了成功的结果。如果仍然需要一些更改,我会让您知道

更新1:

根据Python 3默认设置,编译后的C++文件在Windows下的完全扩展必须是^ {CD4}}。

我们可以通过terminal命令获得扩展名:

python -c "from distutils import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))"

这相当于pybind11文档中的python3-config extension-suffixpython3-config脚本未在Windows环境中实现(至少在Anaconda3发行版中)

相关问题 更多 >