首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用cffi加载.so库

用cffi加载.so库
EN

Stack Overflow用户
提问于 2017-11-27 10:14:02
回答 2查看 2.5K关注 0票数 1

我想使用CFFI在Python中访问一些C库。在构建库之后,我得到了两个文件:$HOME/libcint/include/cint.h$HOME/libcint/lib/libcint.so

现在,对于CFFI模式,我尝试了:

代码语言:javascript
复制
from cffi import FFI
libcint_dir = os.path.expanduser('~/libcint')
ffibuilder = FFI()
ffibuilder.set_source('_libcint',
  r'#include <include/cint.h>',
  include_dirs = [libcint_dir],
  libraries = ['libcint'],
  library_dirs = [os.path.join(libcint_dir, 'lib')],
)

但是它找不到libcint.so文件:

代码语言:javascript
复制
/usr/bin/ld: cannot find -llibcint

libcint_dir中的路径是正确的,因为我没有收到任何关于没有找到头文件的错误消息。此外,我还成功地使用ctypes模块对库进行了接口,因此libcint.so本身应该很好。

我在这里做错什么了?

如果我做得对,那么这里需要三个步骤。(如果我搞错了,请纠正我。)

  1. 编译libcint生成libcint.so
  2. 用CFFI构建Python包装器
  3. 将步骤2中构建的模块导入实际的Python程序

我在这里的问题是关于第二步。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-28 17:03:05

您说的是libraries = ['libcint'],这意味着编译器将查找一个名为liblibcint.so的文件。因此,您应该编写的是libraries = ['cint']

票数 4
EN

Stack Overflow用户

发布于 2017-11-27 13:47:56

您可能被编译时与库的运行时位置问题所困扰。你给图书馆的路径只在GCC编译的时候使用。在运行时,它只查找具有正确名称的库,但只使用系统配置的默认路径。所以你需要告诉系统在哪里可以找到那个图书馆。你可以做以下之一:

  • 将库移到像/usr/local/lib这样的标准地方;
  • 使用环境变量LD_LIBRARY_PATH=/path/to/library运行;
  • 如果要对编译模块中的路径进行硬编码,可以在调用set_source()时使用set_source。

这都是假设Linux。在不同的平台上,这三种选择可能也是可用的,但细节不同.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47508459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档