SWIG 和 Visual Studio 入门
Posted
技术标签:
【中文标题】SWIG 和 Visual Studio 入门【英文标题】:Getting Started with SWIG and Visual Studio 【发布时间】:2012-08-19 00:24:34 【问题描述】:我正在尝试使用我从 swig,org 下载的示例使用 Visual Studio 2010 创建我的第一个 SWIG python DLL。我正在运行 64 位的 Windows 专业版。我下载了 swigwin-2.0.7 并解压。我遵循了here 和here 的说明,在这两种情况下,包装文件都已构建,但项目构建失败。链接器抱怨 56 个未解析的外部符号,所有符号的名称都类似于 __imp__PyBytes_AsStringAndSize 或 __imp__PyExc_RuntimeError。
我已经尝试过使用我的 python 2.7 安装以及我的 python 3.2 安装,结果相似。我必须从源代码为我的平台构建 swig 吗?我在这上面花了 6 个小时左右,我很困惑。
【问题讨论】:
你从 swig.org 下载了什么例子?常见错误是为 Python 库提供了错误的路径,或者混合了 32 位和 64 位 Python 和扩展,但这些错误会产生与您所看到的不同的错误。您是否完全按照说明进行操作? (我写了你引用的第二组。) 感谢您的帮助。我下载的例子是一个叫做简单的例子。我当然试图完全按照说明进行操作。库的路径是正确的。我确定是这样,因为在我的一次迭代中,我输入了错误的库名称,并且链接器抱怨,但我现在没有收到该错误消息。 【参考方案1】:按照说明 here,使用来自 SWIG、Windows 7 64 位和 Python 2.7 32 位的 simple
Python 示例,我没有看到 OP 的特定错误。我看到了:
1>example_wrap.obj : error LNK2019: unresolved external symbol "int __cdecl gcd(int,int)" (?gcd@@YAHHH@Z) referenced in function __wrap_gcd
1>example_wrap.obj : error LNK2001: unresolved external symbol "double Foo" (?Foo@@3NA)
由于 simple
示例是 C 源代码而不是 C++,因此必须进行两项更改:
-
不要在
swig
命令行上使用-c++
开关(说明的第13 步)。
生成的文件现在是 example_wrap.c
而不是 example_wrap.cxx
(在说明的第 14 步和第 19 步中提到)。
或者,在这种情况下,只需在按照说明操作之前将 example.c
重命名为 example.cpp
,它们应该可以正常工作。
【讨论】:
是的,感谢您的跟进。我远程桌面到我的办公机器,它有 32 位 python,和你做了同样的事情,结果和你一样。然后我尝试在我的家用机器上从源代码构建 64 位 SWIG,但我仍然得到所有相同的未解析符号。也许 SWIG 还不支持 64 位 python? 我也用 32 位 Python 3.2 和 64 位 Python 3.3b2 进行了测试。 3.3b2 生成的 example.py 代理有问题,但 _example.pyd 工作正常。 澄清...您是从源代码构建 SWIG 吗?在所有情况下,我都使用了从 swig.org 下载的 2.0.7 二进制文件。 最初,我在办公室机器和家用机器上都使用了从 swig.org 下载的二进制文件。在办公机器上取得成功后,我想也许我必须为我的机器编译一个 64 位版本的 SWIG,因为我能看到的唯一区别是我在工作中使用 32 位 python 和 64 位蟒蛇在家里。我只是尝试在我的家用机器上安装 SIP。我无法让 NMAKE 工作,所以我尝试使用 MinGW 并遇到类似的链接器错误:各种名称以 imp_ 开头的未解析符号。这是python 3.2。我没有打扰 2.7 SWIG 不需要是 64 位的。swigwin
发行版中的 32 位二进制文件就是您所需要的。以上是关于SWIG 和 Visual Studio 入门的主要内容,如果未能解决你的问题,请参考以下文章
通过 SWIG 和 Visual Studio 2015 在 Java 中使用已编译的 DLL
Nodejs in Visual Studio Code 04.Swig模版
尝试获取一个 C 库并使用 swig 将其公开给 Windows 中的 Python。关于静态与动态以及使用 Visual Studio for swig 的问题