Python 使用cffi加载.so库

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

我想在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=[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产生
    libcint.so
  • 使用CFFI构建Python包装器
  • 将步骤2中构建的模块导入到实际的Python程序中

  • 我的问题是关于第二步。

    您可能会被库的编译时间与运行时位置的问题所困扰。您提供给库的路径仅在编译时由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
    。是的,就是这样!头文件有不同的名称似乎很奇怪。你能相应地重新表述你的答案吗?用另一个答案。