问题标签 [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 回答
3553 浏览

c++ - Passing a Python array to a C++ vector using Swig

I have an array of objects in Python

and I want to pass them to off to a C++ function to perform some computation. I'm using SWIG to write my interface. The class type of the passed object is already defined in C++.

What's the best way to do this?

0 投票
1 回答
1156 浏览

php - 用于制作 PHP 扩展的 SWIG,您尝试过吗?

我有一些用 C(不是 C++)编写的小型库和包装器,我想通过扩展将它们提供给 PHP。我阅读了几篇关于编写适当的 PHP 扩展的教程,这似乎并不难,但是我不希望除了库之外维护扩展的麻烦。

我读到SWIG支持构建与 Zend PHP 5 兼容的扩展,这对我来说是完美的。但是,根据 SWIG 文档,支持似乎是测试版。

我的库很常见,作为 C 中使用的元示例:

有没有人有任何经验可以分享使用 SWIG 使库的扩展如此简单?有谁知道使用 SWIG 将 php 扩展作为构建的可选部分用 C 编写的任何免费/开源项目?

在此先感谢,我希望得到一些反馈。如果它是积极的,我会花一些时间真正了解 SWIG。如果不是,我会花时间手工制作扩展。

0 投票
10 回答
31741 浏览

python - 扩展 python - swig,而不是 swig 或 Cython

我在我的 python 代码中发现了瓶颈,玩弄了 Psycho 等。然后决定编写 ac/c++ 扩展来提高性能。

在 swig 的帮助下,您几乎不需要关心争论等。一切正常。

现在我的问题是:swig 创建了一个相当大的 py 文件,它在调用实际的 .pyd 或 .so 代码之前会执行大量“检查”和“PySwigObject”。

如果你手写这个文件或者让 swig 来做,你们中的任何人是否有任何经验是否可以获得更多的性能。

0 投票
2 回答
854 浏览

php - 编译 swig 界面后缺少符号

我试图为我的 linux 共享对象编译一个 php 接口,并且我已经设法使用 swig 的输出让它编译得很好,但是当我尝试加载它时,它抱怨缺少符号:

现在我看了一下zend,它似乎是一个php框架。我想我缺少一个要链接的库,但我不知道哪个库。

有其他人以前做过这个并让它工作吗?

编辑:

0 投票
3 回答
2296 浏览

php - 如何使用swig为c++生成php接口so

我已经尝试了一百件事,但我无法让我的 .so 文件使用 swig 与 php 交互。我可以生成文件,然后我必须编译 Zend 并与之链接以制作 .so 但它现在在加载时会出现段错误。

有人可以告诉我如何使用 swig 为 C++ 库生成 PHP 接口吗?swig 网站上的文档没有帮助。

0 投票
2 回答
2674 浏览

python - C 通过 SWIG 到 Python:无法获取 void** 参数来保持其值

我有一个看起来像这样(简化)的 C 接口:

使用如下:

您会注意到 Operation() 分配缓冲区 p,GetFieldValue 查询 p,而 Cleanup 释放 p。我对 C 接口没有任何控制权——该代码在其他地方被广泛使用。

我想通过SWIG从 Python 调用此代码,但我找不到任何关于如何将指针传递给指针并检索其值的好的示例。

我认为正确的方法是使用类型映射,所以我定义了一个接口,它会在 C 端为我自动取消引用 p:

但是,我无法让以下 python 代码工作:

调用 test.Operation() 后,p 始终保持其初始值 None。

任何帮助找出在 SWIG 中执行此操作的正确方法将不胜感激。否则,我可能只是围绕 C 代码编写一个 C++ 包装器,以阻止 Python 处理指针。然后用 SWIG包装该包装器。有人阻止我!

编辑:

感谢Jorenko,我现在有了以下 SWIG 界面:

使用这个 SWIG 接口的 python 代码如下:

奇怪的是,在 python 代码中, test.GetFieldValue(p) 返回乱码,但 test.gfv(p) 返回正确的值。我已经将调试代码插入到 void* 的类型映射中,并且两者都具有相同的 p 值!电话 对此有何想法?

更新:我决定使用 ctypes。容易得多。

0 投票
2 回答
2109 浏览

c++ - 使用 SWIG 跨 C++ 和 Ruby 的多态性

我使用 SWIG 将 Ruby 脚本包装在 C++ 库周围。在 Ruby 中,我可以从 C++ 类继承,但不能以多态方式将结果指针传递给 C++ 函数。

这是一个具体的例子。SWIG 接口文件定义了具有虚函数 sound() 的基类 Animal:

请注意,我将 SWIG 导向器用于跨语言多态性,但这似乎不起作用。Ruby 脚本如下所示:

脚本中的最后一行产生了这个错误:

所以不知何故 SWIG 不允许我将 Ruby 对象视为指向动物的指针。有任何想法吗?

0 投票
1 回答
3799 浏览

c++ - 如何通过 SWIG 在 C++ 中嵌入 lua

目前,我为我的课程提供了一组 SWIG 包装器,并且它们都可以构建。我可以创建一个 lua 虚拟机并加载我的包装器,但那时我很困惑。谷歌搜索告诉我如何在 swig 中将 c++ 放入 lua 中,但不告诉我如何将 lua 放入 c++ 中。

我真正想做的就是设法实例化一个lua对象并将它传递给我的主游戏引擎对象指针,从那里我可以管理

0 投票
2 回答
1065 浏览

c++ - SWIG Lua 和传递数组

我目前有以下lua代码:

其中 g:SetVertexes() 在 C++ 中实现为:

导致此错误:

有任何想法吗?

0 投票
2 回答
1748 浏览

c++ - 如何将用 swig 包装的 c++ 类的实例推送到 lua 堆栈上?

我有一个用 swig 包装的类,并用 lua 注册。我可以在 lua 脚本中创建此类的实例,并且一切正常。

但是假设我有一个在我的 C++ 代码中创建的类的实例,并调用了 new X,并且我有 la lua_state L,其中有一个我想调用的函数,它接受一个参数,一个 X 的实例......我如何调用该函数。这是(一些)有问题的代码(我省略了错误处理的东西):

主文件

主菜单.lua

目前,我发现可以工作的只是从 swig 生成的 cpp 文件中公开一些功能,然后调用它。由于几个原因,这很糟糕......如果我有多个模块并且我不得不更改 swig 文件中的默认链接规范(使用 -DSWIGRUNTIME=),它将无法工作。

我将以下内容添加到 main.cpp

它得到一个指向模块的指针,然后是指向类型的指针,然后调用 swigs 函数来注册它。不得不挖掘一个不应该是人类可读的文件(所以它在文件的顶部说)而且只是混乱,这是一件不合理的事情!(但它确实有效!)

当然,有更好的方法来完成我正在尝试做的事情。

PS 从高级 pov 我想要的是让 lua 不引用由 GuiInst 中的对象工厂创建的 Gui 组件,以防我遇到这个错误。这是我第一次向脚本语言公开功能,除了一些非常简单(和非 swig)的 python 模块,所以我准备接受建议。

感谢您的任何建议!


RBerteig 对评论的回应

当 swig 运行以防止 lua 构造它的实例时,GuiInst 的构造函数是 #defined 私有的,所以这对我不起作用。我试图阻止的是以下(在lua中):

它将调用“g=new GuiButton”,然后将其注册到 GuiRegionVertical(由于各种原因需要存储一个指针),然后调用“delete g”,并且 GuiRegionVertical 留下了一个指向 g 的悬空指针。

我怀疑真正需要发生的是 GuiRegionVertical::Add(GuiButton*) 应该增加 GuiButton* 的引用计数,然后 GuiRegionVertical 的析构函数应该减少其所有内容的引用计数,尽管我不确定这应该如何痛饮就完事了。

这将消除对私有构造函数、Gui 对象工厂和讨厌的外部对象的需要。

我要解决这个错误吗?

谢谢。