尝试获取一个 C 库并使用 swig 将其公开给 Windows 中的 Python。关于静态与动态以及使用 Visual Studio for swig 的问题

Posted

技术标签:

【中文标题】尝试获取一个 C 库并使用 swig 将其公开给 Windows 中的 Python。关于静态与动态以及使用 Visual Studio for swig 的问题【英文标题】:Trying to take a C library and use swig to expose it to Python in Windows. Questions about static vs dynamic and using Visual Studio for swig 【发布时间】:2012-07-22 02:18:46 【问题描述】:

也许我应该把它分成几个单独的问题,但是在尝试了所有这些之后,我想知道它们是否不都是相互关联的。

这是背景故事:Linux 和 Windows 中都有一些 C 库。有人在 Linux 中使用 swig 将 C 库的 API 暴露给 Python。他或多或少为 swig 编写了一个构建脚本(.i 文件),swig 创建了一个包装 C 文件,他使用 gcc 编译该 C 文件,链接到原始库以获取 Python 模块。

现在我接到了他的工作,并要求我为 Windows 库做这件事。希望我能找到一种快速的方法来使用他的 .i 文件为 Windows 创建一个。我们使用 Visual Studio 2010。

我对swig了解不多,对C或Visual Studio环境也不是很了解,所以我最终放弃了实验,决定在这里问。

问题:

    我拥有的 C 库是静态的。那样可以么?我可以只使用 swig 生成的包装文件并将其链接到静态库以创建动态库(用于 Python)吗?如果答案是否定的,这实际上可能会变得复杂。基本上,我想公开一个特定库的 API(称之为“A”)。反过来,该库依赖于“L”、“C”和“D”。我可以访问“A”和“L”的源代码,所以我可以随意编译它们,但是“C”和“D”不在我的控制范围内——它们是静态库。

    在 Windows 中,为了与 Python 一起使用,我想要的输出文件到底是什么?一个DLL?它应该有一个 .pyd 扩展名吗?我熟悉 Linux 中的所有这些(过去使用过 Cython),但在 Windows 中不熟悉。

    真的希望获得有关在 Visual Studio 2010 中处理此问题的帮助。文档涵盖 Visual Studio 6 和以上几个版本,但细节相对较少。相反,他们建议我只使用 SWIG 附带的 .dsp/.dsw 文件。我确实尝试过使用它附带的一个简单示例。 VS2010 将 dsp/dsw 文件转换为 VS2010 格式,一切正常 - 创建一个 .pyd 文件。但是,当我进入项目/解决方案的属性时,我看到 no 用于 swig 的设置,或者用于创建带有 .pyd 扩展名的东西!自定义/构建后设置为空!我怀疑当 VS2010 将项目文件转换为它的格式时,它会处理所有的构建后设置,但不会显示它们。

非常感谢!

【问题讨论】:

不能对 Windows 的细节发表太多评论,但我认为 .pyd 文件只是具有另一个名称的 .dll。 (refrerence) 【参考方案1】:

    应该没有任何问题。只需在 VS 中添加“L”、“C”和“D”库,就像您通常添加外部库一样。

    是的。目标应该是动态库(.dll),但输出文件应该重命名为_something.pyd(如何配置项目请参见下面的链接)

    SWIG 可以集成到 VS 解决方案构建工具链中。前段时间我写了一本关于如何使用 SWIG 和 Visual Studio 的手册,现在为你更新了:

How to use SWIG with Visual Studio 2010

【讨论】:

非常感谢。显然我或多或少正确地完成了它,但只是没有将它重命名为 pyd。我想到了这个想法,但是关于它为什么不起作用的 10 种左右的其他可能性也是如此,你的回答确实有助于我不浪费时间尝试我提出的每一个猜想。并感谢有关如何在 VS2010 中执行此操作的链接 - 这比解决我原来的问题更有用。

以上是关于尝试获取一个 C 库并使用 swig 将其公开给 Windows 中的 Python。关于静态与动态以及使用 Visual Studio for swig 的问题的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:将 2d numpy 数组传递给 C 函数 f(double a[])

如何将复数从 python numpy 传递给 c(目前正在尝试使用 SWIG)

如何使用 SWIG 枚举枚举成员

SWIG / C#:命名空间和模板

使用 SWIG 将向量公开为内存视图

如何使用 swig C++ 命名空间作为 python 模块公开