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
也许我应该把它分成单独的问题,但是在尝试了所有这些之后,我想知道它们是否不都是相互关联的。
这是背景故事:Linux 和 Windows 中都有一些 C 库。有人在 Linux 中使用 swig 将 C 库 API 暴露给 Python。他或多或少为 swig 编写了一个构建脚本(.i 文件),swig 创建了一个package C 文件,他使用 gcc 编译该 C 文件,链接到原始库以获取 Python 模块。
现在我收到了他的工作并要求为 Windows 库做这件事。希望我能找到一种快速的方法来使用他的 .i 文件为 Windows 创建一个。我们使用 Visual Studio 2010。
我对swig了解不多,对C或Visual Studio环境也不是很了解,所以我最终放弃了实验,决定在这里问。
问题:
我拥有的 C 库是静态的。那样行吗?我可以只使用 swig 生成的package文件并将其链接到静态库以创建动态库(用于 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 文件。但是,当我进入项目/解决方案的属性时,我看不到 swig 的设置,也没有看到带有 .pyd 扩展名的设置!自定义/构建后设置为空!我怀疑当 VS2010 将项目文件转换为其格式时,它会处理所有构建后的设置,但不会显示它们。
非常感谢!
这应该没有任何问题。只需在 VS 中添加"L"、"C"和"D"库,就像您通常添加外部库一样。
是的。目标应为动态库 (.dll) 但输出文件应重命名为 _something.pyd(请参阅下面的链接如何配置项目)
SWIG 可以集成到 VS 解决方案构建工具链中。前段时间我写了一本关于如何使用 SWIG 和 Visual Studio 的手册,现在为你更新了:
如何在 Visual Studio 2010 中使用 SWIG