
macOS平台:C语言调用Python生成的动态链接库
跨语言调用在编程中很常见,例如C语言调用Python生成的动态链接库(.so文件)。本文将详细讲解如何在macOS上实现这一过程,并提供示例。
问题描述
在macOS上,如何使用C语言调用Python生成的动态链接库?
解决方法
1. Python端:生成动态链接库
假设有一个Python文件example.py:
立即学习“Python免费学习笔记(深入)”;
def add(a, b):
return a + b
def subtract(a, b):
return a - b
使用setuptools和cython生成动态链接库。创建setup.py文件:
from setuptools import setup, Extension
from Cython.Build import cythonize
ext_modules = [
Extension("example", ["example.py"])
]
setup(
name='example',
ext_modules=cythonize(ext_modules),
)
在终端运行:
python setup.py build_ext --inplace
这将生成example.cpython-39-darwin.so(版本号可能不同)。
2. C语言端:调用动态链接库
使用dlopen和dlsym函数动态加载和调用库函数。示例C程序test.c:
#include#include int main() { void *handle; double (*add)(double, double); double (*subtract)(double, double); handle = dlopen("./example.cpython-39-darwin.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); return 1; } add = dlsym(handle, "add"); if (!add) { fprintf(stderr, "%s\n", dlerror()); dlclose(handle); return 1; } subtract = dlsym(handle, "subtract"); if (!subtract) { fprintf(stderr, "%s\n", dlerror()); dlclose(handle); return 1; } printf("add(3, 4) = %f\n", add(3, 4)); printf("subtract(5, 2) = %f\n", subtract(5, 2)); dlclose(handle); return 0; }
编译并运行:
gcc -o test test.c -ldl ./test
输出:
add(3, 4) = 7.000000 subtract(5, 2) = 3.000000
常见问题及解决方法
- 路径错误: 确保动态链接库路径正确。
- 函数名错误: 检查C代码中的函数名与Python函数名是否一致。
-
库未正确生成: 仔细检查
setup.py配置和编译过程。
通过以上步骤,即可在macOS上实现C语言调用Python生成的动态链接库。 如有问题,请仔细检查每个步骤的细节。










