【问题标题】:loading .so library with cffi使用 cffi 加载 .so 库
【发布时间】:2018-05-10 13:05:49
【问题描述】:

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

现在我尝试了 CFFI API 模式:

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文件:

/usr/bin/ld: cannot find -llibcint

libcint_dir 中的路径是正确的,因为我没有收到任何关于找不到头文件的错误消息。我还设法使用ctypes 模块成功连接了库,所以libcint.so 本身应该没问题。

我在这里做错了什么?

如果我做对了,那么这里需要 3 个步骤。 (如果我在这里混淆了什么,请纠正我。)

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

我的问题是关于第二步。

【问题讨论】:

    标签: python python-cffi


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可能被库的编译时与运行时位置的问题所困扰。您提供给库的路径仅在 GCC 编译时使用。在运行时,它会查找名称正确的库,但仅使用系统配置的默认路径。所以你需要告诉系统在哪里可以找到那个库。您可以执行以下操作之一:

      • 将库移动到标准位置,例如/usr/local/lib

      • 使用环境变量LD_LIBRARY_PATH=/path/to/library运行;

      • 如果你想硬编码编译模块内部的路径,你可以在 set_source() 调用中使用extra_link_args=['-Wl,-rpath=' + path]

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

      【讨论】:

      • 但我说的是编译。上面的代码应该创建_libcint.c_libcint.o。还是我在这里混淆了什么?
      • 啊,也许我很困惑。您可能需要说libraries = ['cint'] 而不是libcint
      • 是的,就是这样!头文件具有不同的名称似乎很奇怪。您能否相应地重新制定您的答案?
      • 在不同的答案中完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多