https://github.com/pybind/pybind11 下载代码并解压
创建visual sdudio(至少2015)win 32 console工程,选 dll
设置为x64, release
设置项目属性,
General里面
Target Name为你要创建的模块名字,Target Extension为.pyd,Configuration Type 为Dynamic Library (.dll)
确保C/C++ > Code Generation里面为Multi-threaded DLL (/MD)
添加include和lib路径
xx\pybind11-master\include
C:\Program Files\Python35\include
C:\Program Files\Python35\libs
这一步开始编译没有错误
添加一个测试.cpp文件和测试代码 [1]
#include <Windows.h>
#include <cmath>
#include <pybind11/pybind11.h>
const double e = 2.7182818284590452353602874713527;
double sinh_impl(double x) {
return (1 - pow(e, (-2 * x))) / (2 * pow(e, -x));
}
double cosh_impl(double x) {
return (1 + pow(e, (-2 * x))) / (2 * pow(e, -x));
}
double tanh_impl(double x) {
return sinh_impl(x) / cosh_impl(x);
}
namespace py = pybind11;
PYBIND11_MODULE(example, m) {
m.def("fast_tanh2", &tanh_impl, R"pbdoc(
Compute a hyperbolic tangent of a single argument expressed in radians.
)pbdoc");
#ifdef VERSION_INFO
m.attr("__version__") = VERSION_INFO;
#else
m.attr("__version__") = "dev";
#endif
}
编译可能提示错误#error: Macro clash with min and max -- define NOMINMAX when compiling your program on Windows
在C++/preprocessor里面添加NOMINMAX,再次编译应该没有错误,会在x64文件夹生成example.pyd
复制到你的python代码所在目录,在代码中添加
import example
print(example.fast_tanh2(1.0))
运行,输出0.7615941559557647
这里可能导入不正确,提示ImportError: dynamic module does not define module export function (PyInit_example)
这很可能是因为PYBIND11_MODULE(example, m)与你项目设置的导出.pyd文件名称不一致造成的 [2]。
参考
这里面提到添加Py_LIMITED_API;到preprocessor,但是却会导致各种编译错误,不知道怎么解决。
[2] https://github.com/pybind/pybind11/issues/160