【问题标题】:How can I wrap a C-Library in SWIG, which has usually to be linked during C-compilation?如何在 SWIG 中包装 C 库,通常必须在 C 编译期间链接?
【发布时间】:2024-01-23 08:21:01
【问题描述】:

给定一个 C 库,如果我想使用它的功能,必须在编译期间链接它。我想使用 SWIG 在 Python 中访问这些函数。我只能找到使用 SWIG 包装 C 代码(example.c)的示例和介绍,没有方法如何包装动态库(example.so)。

【问题讨论】:

    标签: python c shared-libraries wrapper swig


    【解决方案1】:

    要使 .so(或 .a)库案例工作,您需要做的就是在执行示例构建过程的编译步骤时适当地链接库。您仍然必须编译生成的 example_wrap.c,这是您可以链接事物的地方。

    根据 SWIG 文档进行了修改:

    $ swig -python example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
    $ gcc -shared example_wrap.o -o _example.so -lmylib.so
    

    实际上,您也可以在编译时链接器步骤跳过此步骤,并在运行时使用dlopen,而不是将一些额外代码注入模块的 Python 部分,该部分在加载来自 SWIG 的共享对象之前调用 dlopen。

    【讨论】:

    • 是否可以只包装给定的 .so 和 .i 文件?
    • @maxi 是的,如果您知道函数声明是什么样的以及您关心的任何类型定义。