python 创建 动态链接库 到 c++ 调用

1. 如果想要在 c++ 中 debug 模式调试模式运行,windows下的话,需要安装时安装 debug 库

2. 安装 cython

3. 编写 pyx 文件,例如 demo.pyx:

# distutils: language = c++
cdef public int add(int a,int b):
return a + b

4. 编译为 c 代码

 cython demo.pyx

 或者编写 setup.py,然后执行 python setup.py,这种方式可自定义的东西比较多

复制代码
import os
from distutils.core import setup
from Cython.Build import cythonize

setup(name='demo'
      ,ext_modules=cythonize("main.pyx",compiler_directives={'language_level': '3'},annotate=True)
      ,script_args=["build_ext", "-b", "./build", "-t", "./build/temp"])

os.remove("./main.h")
os.remove("./main.cpp")
os.remove("./main.html")
复制代码

5. 在 vsiual studio 中编译 c++

    a) vc++引入python安装目录下的 includes 和 libs 目录,再引用库文件 python310.lib 或 python310_d.lib

    b) 把第4步生成的 demo.h 和 demo.cpp 复制到 c++ 项目,调试直到编译通过

6. 都有 c++ 代码了,导出 dll 已不是问题。但生成的 dll 需要 python 基础环境支持,并且如果调用了其它 python 文件,也需要一同复制到发布目录下

经过几天的摸索,这种方式无法引用 python 当前环境中的包,一旦牵扯到引入其它的模块(比如 easygui ,已在python环境中安装),以下这句代码就会引发异常:

__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_easygui); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)

似乎这样的方法必须是纯C++代码,无法调用python的任何模块,权且当作是一个C++共享模块吧。且这种方式并没有与直接调用pyd文件的python运行在一个上下文中,改变的变量无法在另一种访问方式中留下痕迹。

看来C++调用包含 python模块的代码只能通过c++直接加载 pyd,而不能直接引用 cython 生成的 .h 和 .cpp 文件了。

7. 虽然直接调用c++方法有难度,但可以直接调用 python 方法,python 方法再去调用 cdef 定义的方法,用cython 优化后续的方法就可以了,但不知这样损失的效率到底有多少,起码传参和返回都是 PyObject

posted on   空明流光  阅读(1060)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-11-03 c# 打包安装部署程序自定义操作
2016-11-03 安装恢复Windows10各种坑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示