如何从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
相关产品推荐
相关产品推荐

