gpt4 book ai didi

Cython:链接到库和调用函数

转载 作者:行者123 更新时间:2023-12-04 11:25:55 24 4
gpt4 key购买 nike

我正在尝试为 C 库编写 Cython 包装器。我已经仔细阅读了文档,但我必须遗漏一些东西,因为我无法让以下简单的 Cython 代码工作。
我从以下内容创建了一个共享库:
数学库

#include "mathlib.h"

int add_one(int x){
return x + 1;
}
数学库
extern int add_one(int x);
然后我像这样创建了库:

gcc -c mathlib.cgcc -shared -o libmathlib.so mathlib.o -lm


我的 Cython 文件是 mathlib.pyx、cmathlib.pyd 和 setup.py
cymathlib.pyx
from mathlib cimport add_one  

def add_one_c(int x):
print add_one(x)
return x
数学库.pyd
cdef extern from "mathlib.h":  
int add_one(int x)
安装程序.py
from distutils.core import setup  
from distutils.extension import Extension
from Cython.Build import cythonize

setup(
ext_modules = cythonize([Extension("cymathlib", ["cymathlib.pyx"])], libraries ["mathlib"])
)
模块 cymathlib.so 已创建,但是当我尝试在 Python 中导入它时,出现以下错误: ImportError: dlopen(./cymathlib.so, 2): Symbol not found: _add_one Referenced from: ./cymathlib.so Expected in : ./cymathlib.so 中的平面命名空间"

最佳答案

您的 Extension 似乎出了点问题规范,应该是这样的:

ext_modules = cythonize([Extension("cymathlib", 
["cymathlib.pyx"],
libraries=["mathlib"],
library_dirs=["/place/path/to/libmathlib.so/here"]
)])

为了能够使用该模块,它必须能够找到 libmathlib.so在运行时,因为它将在该文件中查找 add_one 的实际实现。 .除了将文件复制到/usr/lib 或/usr/local/lib(并再次运行 ldconfig),您还可以设置环境变量以确保可以找到该库:
export LD_LIBRARY_PATH=/place/full/path/to/libmathlib.so/here

也可以将 C 代码添加到您正在创建的 python 模块中(因此不再需要编译或使用 libmathlib.so)。您只需添加 mathlib.c文件到 cython 源列表:
ext_modules = cythonize([Extension("cymathlib", 
["cymathlib.pyx","mathlib.c"]
)])

关于Cython:链接到库和调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27680716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com