构建Python插件库: 首先,在Python中编写需要暴露给C++的函数,通常在一个.c文件中,然后使用cython或ctypesgen之类的工具生成相应的头文件(如mylib.pyx),接着编译成共享库(如libmylib.so)。 举例
时间: 2025-01-30 16:11:46 浏览: 43
构建Python插件库的过程大致如下:
首先,假设你在Python模块`my_plugin`中有需要被C++调用的函数,例如计算两个数的和:
```python
# my_plugin.py
def add(a, b):
return a + b
```
为了将这个Python函数暴露给C++,你可以使用Cython,它允许编写混合C和Python的代码。创建一个新的Cython源文件`mylib.pyx`:
```cython
# mylib.pyx
from libcpp import std
cdef extern from "my_plugin.py":
cdef double add(double a, double b)
cpdef double cython_add(double a, double b):
"""Wrapper for the Python function add"""
return add(<double>a, <double>b)
```
在这里,我们声明了一个外部函数`add`,并创建了Cython版本的包装函数`cython_add`,以便在C++中更方便地调用。
接下来,安装必要的依赖并编译`mylib.pyx`:
```bash
pip install Cython
cython -a mylib.pyx # 生成.c文件和.pxd头文件
gcc -shared -fPIC -I/usr/include/python3.9 -o libmylib.so mylib.c -lpython3.9
```
现在你得到了一个名为`libmylib.so`的共享库,可以供C++程序通过dlopen加载并调用`cython_add`函数。
举个简单的C++示例:
```cpp
#include <iostream>
#include <dlfcn.h>
extern "C" {
double cython_add(double a, double b);
}
int main() {
void* handle = dlopen("./libmylib.so", RTLD_LAZY);
if (!handle) {
std::cerr << "Error loading library: " << dlerror() << std::endl;
return 1;
}
double sum = cython_add(3.0, 4.5);
std::cout << "Sum: " << sum << std::endl;
dlclose(handle);
return 0;
}
```
阅读全文
相关推荐




















