问题标签 [swig]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
727 浏览

python - 导入 Swig 生成的包装器时 Python 挂起

当我尝试将 c++ 共享库导入到 python 2.5 的 Windows 版本时,Python 正在“挂起”,我不知道为什么。

在 Linux 上,一切正常。我们可以编译我们所有的 C++ 代码,生成 swig 包装类。它们可以编译并且可以在 python 2.5 或 2.6 中导入和使用。现在,我们正在尝试使用 Cygwin 将代码移植到 Windows。

我们能够使用 -mno-cygwin 将每个 C++ 库编译为共享 dll,这消除了对 cygwin1.dll 的依赖。从本质上讲,这会导致 gcc 目标是 MinGW 而不是 Cygwin,从而使生成的二进制文件能够在 Windows 中运行而不依赖于 Cygwin。此外,这些共享库中的每一个都可以链接到 c++ 二进制文件并成功运行。

完成此操作后,我们使用 swig 为每个共享库生成包装器。这些包装器可以毫无问题地生成、编译和链接。

然后,下一步是将生成的 python 包装器导入 python。我们能够导入除两个库之外的所有库。对于这两个不起作用,当我们尝试将 .py 或 .pyd 文件导入 Windows python(使用 Visual C++ 编译的版本)时,python 挂起。我们不能用 ctrl+c 或 ctrl+d 杀死 python,唯一的办法是通过任务管理器杀死它。如果我们将 gdb 附加到 python 进程并打印堆栈跟踪,我们大多会得到垃圾,没有任何用处。

接下来,我们尝试使用 ifdef 将 *.i 文件中的代码块取出并重新创建 swig 包装器。这个过程至少允许我将库导入 Windows python,但问题是我们必须注释掉太多软件运行所必需的函数。通常,必须注释掉三种类型的函数:静态函数、虚拟 const 函数和未声明为 const 的常规公共函数。这也是可重现的,如果我们取消注释这些函数中的任何一个,那么导入会再次挂起。

接下来,我们尝试将函数提取到一个简单的 hello world 程序中,生成一个 swig 包装器并将它们导入 python。这行得通。我们完全从头文件中复制了函数。它们在非常小的测试程序中工作,而不是在更大的共享库中。我们以完全相同的方式构建它们。

因此,任何关于为什么会发生这种情况的想法,甚至只是更好的调试技术都会非常有帮助。

这些在使用 gcc 3 和 4 以及 python 2.5 和 2.6 的 Linux 上运行良好。在 Windows 上,这是我正在使用的软件:gcc 3.4.4 swig 1.39(来自 swig.org 的 Windows 二进制文件)python 2.5.4(来自 python.org 的 Windows 二进制文件和包含/库)

这些是我用于构建简单的 hello world 程序的命令(完整的库使用相同的选项,只是因为额外的 -I、-L 和 -l 选项而更长)

痛饮 -c++ -python -o test_wrap.cc test.i

gcc -c -mno-cygwin test.cc

gcc -c -mno-cygwin test_wrap.cc -I/usr/python25/include

dlltool --export-all --output-def _test.def test.o

gcc -mno-cygwin -shared -s test_wrap.o test.o -L/usr/python25/libs -lpython25 -lstdc++ -o _TestModule.pyd

谢谢, AJ

0 投票
1 回答
9893 浏览

java - 如何使用 JNI 或 JNA 读取窗口标题?

期待重返发展空间;主要使用Java调用一些本机win32函数(我不想在.NET中构建)......

有人可以指出我可以使用Java(JNI / JNA / SWIG)从不同的运行窗口中读取标题的地方。假设您知道您尝试挂接的应用程序在内存空间的哪个位置。

0 投票
1 回答
761 浏览

java - 如何使用 SWIG 返回指向用户定义的类对象的指针

我有以下由 swig 包装的代码:

controller有一个私有构造函数。

使这样的事情引发异常的正确咒语是什么?

0 投票
6 回答
8842 浏览

c++ - Python 属性和 Swig

我正在尝试使用 swig 为一些 C++ 代码创建 python 绑定。我似乎遇到了一个问题,试图从我拥有的一些访问器函数创建 python 属性,方法如下:

我尝试使用 python 属性函数创建一个属性,但似乎 swig 生成的包装类与它不兼容,至少对于 setter 而言。

你如何使用 swig 创建属性?

0 投票
1 回答
2055 浏览

perl - 如何将 Perl 数组传入/传出 SWIG?

在 Perl 中,我习惯于在 subs 之间传递数组

如何使用 SWIG 函数实现类似的行为?

痛饮这个:

产生一个期望数组引用并返回数组引用的子?我正在使用 SWIG 附带的 stl 模板。

我需要为此写一个类型图吗?似乎这已经在某处被覆盖了。

0 投票
2 回答
2213 浏览

openssl - SWIG OpenSSL 1.0 - STACK_OF 宏的问题

使用之前的 OpenSSL 版本,可以在 SWIG .i 文件中执行此操作:

对于 OpenSSL 1.0.0beta3,这会失败,因为似乎不再定义 STACK。新的 OpenSSL 试图在类型检查方面做得更好,所以应该使用 STACK_OF 宏,它的定义如下:

如果我将上面的代码更改为使用 STACK_OF:

然后 SWIG 不喜欢这样:

我可以通过将其更改为:

但这显然不好,因为 OpenSSL 可能会在不同版本之间更改宏。有 _STACK 结构,但同样是 OpenSSL 私有细节,可能会随着版本的不同而变化。堆栈也可以作为参数传入,如下所示:

SWIG 也不喜欢哪个。

有没有办法在不使用 OpenSSL 私有详细信息的情况下完成这项工作?

0 投票
5 回答
1568 浏览

c++ - Swig C++ Lua Pass 类通过引用

我不知道为什么我很难处理这个。我想做的就是:

我遇到的问题是,在 swigging 这段代码之后,我无法弄清楚如何使 lua 脚本运行良好。

我得到的错误是“重载函数 'new_Foo2' 的参数错误”:可能的 c/c++ 原型是: foo2() foo2(foo const &)

如果我尝试使用 do f2 = f,也会发生同样的事情。据我了解,所有内容都存储为指针,因此我确实尝试添加一个额外的构造函数,该构造函数将指针指向 foo 但无济于事。

0 投票
2 回答
1305 浏览

swig - 如何将多个参数折叠成一个 SWIG 参数

我正在尝试编写一个类型映射,将多个/可变参数转换为一个输入参数。

例如,假设我有一个带有向量的函数。

我想这样称呼它(恰好在Perl中)

typemap 应该接受参数 ($argnum, ...),将它们收集到一个向量中,然后将其传递给 foo。

到目前为止我有这个:

这会起作用,除了 SWIG 检查参数的数量

如果我做:

SWIG 将期望使用两个参数调用 foo。

也许有一种方法可以告诉 SWIG 从对 foo 的调用中抑制 arg2?

我不能在我的 .i 中使用它:

因为我想有不同的类型映射,这取决于 foo 期望的类型(一个 int、字符串等的数组)。也许有一种方法可以给“...”一个类型

有没有办法做到这一点?

0 投票
2 回答
5851 浏览

c++ - C++“转换丢失限定符”编译错误

今天在调试 SWIG 类型映射时遇到了一个有趣的问题。有人愿意告诉我为什么 Visual C++ 2008 在从 转换为 时会抛出“转换丢失限定符”错误ourLib::Char *const ourLib::Char * &?我认为Type *->const Type *是一个微不足道的转换,并且(在调用函数时)Lvalue->Lvalue &也是如此。

编辑:我们最终采用的解决方案:

删除constfromconst ourLib::Char * tmp会导致我描述的错误。

0 投票
1 回答
2398 浏览

c++ - Python 非平凡的 C++ 扩展

我有相当大的 C++ 库和几个支持它的子库,我需要把整个东西变成一个 python 扩展。我使用 distutils 是因为它需要跨平台,但如果有更好的工具,我愿意接受建议。

有没有办法让 distutils 首先编译子库,然后在从主库创建扩展时链接它们?