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

如何从Cython DLL中导出C函数?寻求便捷实用的解决方案

Cython模块同时支持Python与C/C++调用的实用方案

在.pyx文件中直接触发导出标记(跨平台兼容)

可以直接在.pyx文件中通过内嵌C代码定义平台相关的导出宏,无需手动修改生成的C文件或编写.def文件:

方法1:直接标记函数

# example.pyx
# 定义跨平台导出宏
cdef extern from *:
    """
    #ifdef _WIN32
    #define DLLEXPORT __declspec(dllexport)
    #else
    #define DLLEXPORT __attribute__((visibility("default")))
    #endif
    """
    DLLEXPORT

# 同时用cpdef(支持Python调用)和DLLEXPORT(支持C/C++调用)标记函数
cpdef DLLEXPORT double SQ(double x):
    return x * x

方法2:extern块批量声明导出函数

如果需要统一管理多个导出函数,可使用__pyx_extern_c__块:

# example.pyx
cdef extern from *:
    """
    #ifdef _WIN32
    #define DLLEXPORT __declspec(dllexport)
    #else
    #define DLLEXPORT __attribute__((visibility("default")))
    #endif
    """
    DLLEXPORT

__pyx_extern_c__:
    cpdef DLLEXPORT double SQ(double x)

cpdef double SQ(double x):
    return x * x

最实用的解决方案

上述第一种方法是最轻量化的实现:

  • 仅需在.pyx文件中添加几行宏定义,无需修改编译脚本或额外配置;
  • 跨平台兼容,Windows下自动生成__declspec(dllexport),Linux/macOS下自动设置函数可见性;
  • 编译命令保持不变:cythonize -a -i -3 example.pyx,生成的.pyd/.so文件可同时被Python和C/C++程序直接调用。

若涉及复杂项目,也可通过setup.py配置编译参数,但.pyx内直接处理的方式更简洁,代码可移植性更强。

内容的提问来源于stack exchange,提问作者kxr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:45:31