python 通过pybind11调用C++ dll 基础篇

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]。

 

参考

[1] https://docs.microsoft.com/en-us/visualstudio/python/working-with-c-cpp-python-in-visual-studio?view=vs-2017

这里面提到添加Py_LIMITED_API;到preprocessor,但是却会导致各种编译错误,不知道怎么解决。

[2] https://github.com/pybind/pybind11/issues/160

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luchang-Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值