You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:27:22