Python 使用cffi加载.so库
我想在Python中使用CFFI访问一些C库。构建库之后,我得到了两个文件:Python 使用cffi加载.so库,python,python-cffi,Python,Python Cffi,我想在Python中使用CFFI访问一些C库。构建库之后,我得到了两个文件:$HOME/libcint/include/cint.h和$HOME/libcint/lib/libcint.so 现在,对于CFFI API模式,我尝试了: 来自cffi导入FFI libcint_dir=os.path.expanduser(“~/libcint”) ffibuilder=FFI() ffibuilder.set_source(“libcint”), r'#包括', include_dirs=[lib
$HOME/libcint/include/cint.h
和$HOME/libcint/lib/libcint.so
现在,对于CFFI API模式,我尝试了:
来自cffi导入FFI
libcint_dir=os.path.expanduser(“~/libcint”)
ffibuilder=FFI()
ffibuilder.set_source(“libcint”),
r'#包括',
include_dirs=[libcint_dir],
库=['libcint'],
library_dirs=[os.path.join(libcint_dir,'lib'),
)
但是它找不到libcint.so
文件:
/usr/bin/ld: cannot find -llibcint
libcint\u dir
中的路径是正确的,因为我没有收到任何关于找不到头文件的错误消息。此外,我还成功地使用ctypes
模块与库接口,因此libcint.so
本身应该很好
我做错了什么
如果我做对了,那么这里需要3个步骤。(如果我在这里混淆了什么,请纠正我。)
libcint.so
我的问题是关于第二步。您可能会被库的编译时间与运行时位置的问题所困扰。您提供给库的路径仅在编译时由GCC使用。在运行时,它查找具有正确名称的库,但仅使用系统配置的默认路径。因此,您需要告诉系统在哪里可以找到该库。您可以执行以下操作之一:
- 将库移动到标准位置,如
/usr/local/lib
- 使用环境变量
运行LD_LIBRARY_PATH=/PATH/to/LIBRARY
- 如果要硬编码编译模块内的路径,可以在set_source()调用中使用
extra_link_args=['-Wl,-rpath='+path]
这都是假设Linux。在不同的平台上,这三个选项也可能可用,但细节不同。您可能会被库的编译时间与运行时位置的问题所困扰。您提供给库的路径仅在编译时由GCC使用。在运行时,它查找具有正确名称的库,但仅使用系统配置的默认路径。因此,您需要告诉系统在哪里可以找到该库。您可以执行以下操作之一:
- 将库移动到标准位置,如
/usr/local/lib
- 使用环境变量
运行LD_LIBRARY_PATH=/PATH/to/LIBRARY
- 如果要硬编码编译模块内的路径,可以在set_source()调用中使用
extra_link_args=['-Wl,-rpath='+path]
这都是假设Linux。在不同的平台上,这三个选项也可能可用,但细节不同…您说的是
库=['libcint']
,这意味着编译器将查找名为liblibcint.so
的文件。因此,您应该编写的是libraries=['cint']
您说的是libraries=['libcint']
,这意味着编译器将查找名为libcint.so
的文件。因此,您应该编写的是libraries=['cint']
,但我说的是编译。上面的代码应该创建\u libcint.c
和\u libcint.o
。还是我搞糊涂了?啊,也许我搞糊涂了。可能你需要说libcint=['cint']
而不是libcint
。是的,就是这样!头文件有不同的名称似乎很奇怪。你能相应地重新表述你的答案吗?用不同的答案回答。但我说的是编译。上面的代码应该创建\u libcint.c
和\u libcint.o
。还是我搞糊涂了?啊,也许我搞糊涂了。可能你需要说libcint=['cint']
而不是libcint
。是的,就是这样!头文件有不同的名称似乎很奇怪。你能相应地重新表述你的答案吗?用另一个答案。