使用pybind11与Eigen编译报错:调用已删除函数
问题原因
pybind11的Eigen绑定模块不支持直接将Python对象转换为Eigen::Map类型作为函数参数。Eigen::Map是对已有内存块的轻量视图,而Python传入的数组内存由pybind11管理,无法直接映射为Eigen::Map。pybind11在eigen.h中特意删除了eigen_map_caster的load方法和转换运算符,以此阻止这种不安全的用法,这就是你遇到报错的直接原因。
解决方案
将函数参数替换为const Eigen::Ref<MatrixX3d>&,Eigen::Ref是Eigen提供的通用引用类型,既能接受Eigen::Matrix对象,也能兼容Eigen::Map,同时pybind11可以完美处理Python数组到Eigen::Ref的转换。
修改后的C++代码:
#include <pybind11/pybind11.h> #include <pybind11/eigen.h> namespace py = pybind11; using MatrixX3d = Eigen::Matrix<double, Eigen::Dynamic, 3, Eigen::RowMajor>; PYBIND11_MODULE(test, m) { m.def("func", [](const Eigen::Ref<MatrixX3d>& x) { // 这里可以像使用Map一样操作x,无需修改原有逻辑 }); }
如果你的代码内部确实需要显式使用Eigen::Map,可以在lambda函数内部创建:
m.def("func", [](const Eigen::Ref<MatrixX3d>& x) { Eigen::Map<const MatrixX3d> x_map(x.data(), x.rows(), x.cols()); // 使用x_map进行后续操作 });
验证
修改后重新编译即可,pybind11会自动处理Python numpy数组到Eigen::Ref的转换,CMake配置文件无需改动。
内容的提问来源于stack exchange,提问作者T.L
相关产品推荐
相关产品推荐

