mingw(Qt) 利用pybind11生成python库

1.anaconda 安装创建环境

bash 复制代码
conda create --name test_pybind
conda activate test_pybind11
conda install pybind11

2.Qt CMake工程

CMakeLists.txt

bash 复制代码
cmake_minimum_required(VERSION 3.5)

project(testpybind11 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(PYTHON_EXECUTABLE "C:/Users/93551/.conda/envs/test_pybind11/python.exe")
set(PYTHON_INCLUDE_DIR "C:/Users/93551/.conda/envs/test_pybind11/include")
set(PYTHON_LIBRARY "C:/Users/93551/.conda/envs/test_pybind11/libs")

set(pybind11_DIR "C:/Users/93551/.conda/envs/test_pybind11/Lib/site-packages/pybind11/share/cmake/pybind11")

include_directories(${PYTHON_INCLUDE_DIR})
link_directories(${PYTHON_LIBRARY})


find_package(Python REQUIRED)
find_package(pybind11 REQUIRED)
add_library(testpybind11 SHARED Myclass.cpp)
target_link_libraries(testpybind11  python3.lib python312.lib)

# 后缀名改成pyd能够被python引用
set_target_properties(testpybind11 PROPERTIES SUFFIX ".pyd")

MyClass.h

cpp 复制代码
#ifndef MYCLASS_H
#define MYCLASS_H


class MyClass {
public:
    MyClass() : value(0) {}
    void setValue(int val) { value = val; }
    int getValue() { return value; }
    int value;
};


#endif // MYCLASS_H

MyClass.cpp

cpp 复制代码
#include "MyClass.h"
#include "Python.h"

#include <pybind11-global/pybind11/pybind11.h>
#include <pybind11-global/pybind11/eval.h>
#include <pybind11-global/pybind11/embed.h>
namespace py = pybind11;
using namespace py;

PYBIND11_MODULE(testpybind11, m) {
    py::class_<MyClass>(m, "MyClass")
        .def(py::init<>())
        .def("setValue", &MyClass::setValue)
        .def("getValue", &MyClass::getValue);
}

3.将生成的libtestpybind11.pyd为testpybind11.pyd

这一步非常重要,否则报错

python 复制代码
ImportError: dynamic module does not define module export function

4.python调用

python 复制代码
import testpybind11
 my_obj = testpybind11.MyClass()
my_obj.setValue(10)
print(my_obj.getValue())
相关推荐
羊小猪~~几秒前
算法/力扣--栈与队列经典题目
开发语言·c++·后端·考研·算法·leetcode·职场和发展
Noushiki几秒前
数据一致性保障方案 -java后端
java·开发语言
书到用时方恨少!几秒前
Python 零基础入门系列(终篇):综合实战项目
开发语言·python
Evand J2 分钟前
【MATLAB例程】基于EKF的分布式卡尔曼滤波,用于多个车辆的集群导航,融合IMU和GNSS、相对测量的UWB数据
开发语言·分布式·matlab
人间打气筒(Ada)2 分钟前
go:如何实现接口限流和降级?
开发语言·中间件·go·限流·etcd·配置中心·降级
小陈工2 分钟前
Python Web开发入门(二):Flask vs Django,项目结构大比拼
前端·数据库·python·安全·web安全·django·flask
云泽8082 分钟前
深入红黑树:SGI-STL 中 map 与 set 的关联容器架构剖析
开发语言·c++·stl底层架构
福楠3 分钟前
constexpr 全家桶
c语言·开发语言·c++
REDcker4 分钟前
C++ vcpkg:安装、使用、原理与选型
开发语言·c++·windows·操作系统·msvc·vcpkg
晓13134 分钟前
React篇——第五章 React Router实战
开发语言·javascript·ecmascript