问题标签 [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.
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
java - 如何使用 JNI 或 JNA 读取窗口标题?
期待重返发展空间;主要使用Java调用一些本机win32函数(我不想在.NET中构建)......
有人可以指出我可以使用Java(JNI / JNA / SWIG)从不同的运行窗口中读取标题的地方。假设您知道您尝试挂接的应用程序在内存空间的哪个位置。
java - 如何使用 SWIG 返回指向用户定义的类对象的指针
我有以下由 swig 包装的代码:
controller
有一个私有构造函数。
使这样的事情不引发异常的正确咒语是什么?
c++ - Python 属性和 Swig
我正在尝试使用 swig 为一些 C++ 代码创建 python 绑定。我似乎遇到了一个问题,试图从我拥有的一些访问器函数创建 python 属性,方法如下:
我尝试使用 python 属性函数创建一个属性,但似乎 swig 生成的包装类与它不兼容,至少对于 setter 而言。
你如何使用 swig 创建属性?
perl - 如何将 Perl 数组传入/传出 SWIG?
在 Perl 中,我习惯于在 subs 之间传递数组
如何使用 SWIG 函数实现类似的行为?
痛饮这个:
产生一个期望数组引用并返回数组引用的子?我正在使用 SWIG 附带的 stl 模板。
我需要为此写一个类型图吗?似乎这已经在某处被覆盖了。
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 私有详细信息的情况下完成这项工作?
c++ - Swig C++ Lua Pass 类通过引用
我不知道为什么我很难处理这个。我想做的就是:
我遇到的问题是,在 swigging 这段代码之后,我无法弄清楚如何使 lua 脚本运行良好。
我得到的错误是“重载函数 'new_Foo2' 的参数错误”:可能的 c/c++ 原型是: foo2() foo2(foo const &)
如果我尝试使用 do f2 = f,也会发生同样的事情。据我了解,所有内容都存储为指针,因此我确实尝试添加一个额外的构造函数,该构造函数将指针指向 foo 但无济于事。
swig - 如何将多个参数折叠成一个 SWIG 参数
我正在尝试编写一个类型映射,将多个/可变参数转换为一个输入参数。
例如,假设我有一个带有向量的函数。
我想这样称呼它(恰好在Perl中)
typemap 应该接受参数 ($argnum, ...),将它们收集到一个向量中,然后将其传递给 foo。
到目前为止我有这个:
这会起作用,除了 SWIG 检查参数的数量
如果我做:
SWIG 将期望使用两个参数调用 foo。
也许有一种方法可以告诉 SWIG 从对 foo 的调用中抑制 arg2?
我不能在我的 .i 中使用它:
因为我想有不同的类型映射,这取决于 foo 期望的类型(一个 int、字符串等的数组)。也许有一种方法可以给“...”一个类型
有没有办法做到这一点?
c++ - C++“转换丢失限定符”编译错误
今天在调试 SWIG 类型映射时遇到了一个有趣的问题。有人愿意告诉我为什么 Visual C++ 2008 在从 转换为 时会抛出“转换丢失限定符”错误ourLib::Char *
吗const ourLib::Char * &
?我认为Type *
->const Type *
是一个微不足道的转换,并且(在调用函数时)Lvalue
->Lvalue &
也是如此。
编辑:我们最终采用的解决方案:
删除const
fromconst ourLib::Char * tmp
会导致我描述的错误。
c++ - Python 非平凡的 C++ 扩展
我有相当大的 C++ 库和几个支持它的子库,我需要把整个东西变成一个 python 扩展。我使用 distutils 是因为它需要跨平台,但如果有更好的工具,我愿意接受建议。
有没有办法让 distutils 首先编译子库,然后在从主库创建扩展时链接它们?