能否在C语言中使用Cython生成的.so文件?
在C语言中调用Cython生成的.so文件
完全可以在C程序中调用Cython生成的共享库(.so文件),下面是具体的实现步骤:
1. 编写带C导出接口的Cython代码
需要在Cython代码中明确标记要暴露给C语言调用的函数,使用cdef public关键字声明这些函数,确保它们会被导出到.so的符号表中。
示例文件math_utils.pyx:
# math_utils.pyx cdef public int add(int a, int b): return a + b cdef public float multiply(float x, float y): return x * y
2. 编译Cython代码生成.so文件
编写setup.py脚本,用Cython将.pyx文件编译为共享库:
from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize("math_utils.pyx"), )
执行编译命令:
python setup.py build_ext --inplace
编译完成后会生成类似math_utils.cpython-310-x86_64-linux-gnu.so的文件,你可以手动重命名为libmath_utils.so(符合C语言库的命名规范,方便后续链接)。
同时编译过程会自动生成math_utils.h头文件,里面包含了导出函数的C语言声明,这是C程序调用时必须的。
3. 编写C语言调用程序
创建C程序文件main.c,引入生成的头文件后直接调用导出的函数:
#include <stdio.h> #include "math_utils.h" int main() { int sum_result = add(3, 5); float product_result = multiply(2.5f, 4.0f); printf("3 + 5 = %d\n", sum_result); printf("2.5 * 4.0 = %.2f\n", product_result); return 0; }
4. 编译并运行C程序
使用gcc编译C程序,链接生成的.so库。需要注意链接Python的运行时依赖,你可以用python3-config工具自动获取编译和链接参数:
gcc main.c -o main $(python3-config --cflags --ldflags) -L. -lmath_utils
$(python3-config --cflags --ldflags):自动获取Python的编译和链接参数,确保依赖正确-L.:指定当前目录为库搜索路径-lmath_utils:链接libmath_utils.so库
运行程序前,确保系统能找到.so文件,要么将其移动到系统标准库路径(如/usr/lib),要么临时设置库路径:
LD_LIBRARY_PATH=./ ./main
运行后会输出:
3 + 5 = 8 2.5 * 4.0 = 10.00
注意事项
- Cython生成的.so依赖Python运行时,所以C程序运行时必须有Python环境支持,不能脱离Python单独运行
- 确保编译C程序时使用的Python版本和编译Cython代码的版本一致,避免版本不兼容问题
- 如果函数涉及Python对象(如列表、字典),需要在C程序中手动处理Python的API调用,这部分会更复杂,建议先从基础的数值类型函数开始测试
内容的提问来源于stack exchange,提问作者stephen telian
相关产品推荐
相关产品推荐

