问题标签 [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 投票
8 回答
7395 浏览

c++ - 我应该如何对代码生成器进行单元测试?

我知道这是一个困难且开放式的问题,但我想我会把它扔到地板上,看看是否有人有任何有趣的建议。

我开发了一个代码生成器,它将我们的 python 接口与我们的 C++ 代码(通过 SWIG 生成)相结合,并生成将其公开为 WebServices 所需的代码。当我开发这段代码时,我是使用 TDD 完成的,但我发现我的测试非常脆弱。因为每个测试本质上都想验证对于给定的输入代码位(恰好是 C++ 标头)我会得到给定的输出代码位我编写了一个小引擎,它从 XML 输入文件中读取测试定义并生成测试来自这些期望的案例。

问题是我根本不敢修改代码。那以及单元测试本身是a:复杂和b:脆弱的事实。

所以我试图想出解决这个问题的替代方法,这让我感到震惊,我可能是以错误的方式解决它。也许我需要更多地关注结果,IE:我生成的代码是否真正运行并执行我想要的操作,而不是代码看起来像我想要的那样。

有没有人有类似的经历,他们愿意分享?

0 投票
7 回答
4742 浏览

python - 在编译之前使用 Python 代码进行原型设计

一段时间以来,我一直在考虑编写一个峰值拟合库。我对 Python 非常了解,并计划一开始就用 Python 实现一切,但设想我最终可能不得不用编译语言重新实现一些核心例程。

IIRC,Python 最初的职责之一是作为原型语言,但是 Python 在允许将函数、函子、对象传递给函数和方法方面非常自由,而我怀疑 C 或 Fortran 并非如此。

关于设计我设想必须与编译语言接口的函数/类,我应该知道什么?这些潜在问题中有多少是由 cTypes、bgen、SWIGBoost.PythonCythonPython SIP等库处理的?

对于这个特定的用例(拟合库),我想允许用户将数学函数(高斯、洛伦兹等)定义为 Python 函数,然后可以将其传递给编译的代码拟合库进行解释。传递和返回数组也是必不可少的。

0 投票
3 回答
9312 浏览

c# - 将 SWIG 与 C# 结合使用时的最佳实践是什么?

有没有人在 C# 中使用过SWIG库?如果有,您发现了哪些陷阱以及使用该库的最佳方式是什么?我正在考虑将它用作用 C 编写的程序的包装器,并且我想包装头文件,以便在我的 .NET 应用程序中使用它们。

编辑:对目标操作系统的一些说明。

我计划在 Linux 和 Windows 上运行该应用程序,因此我正在研究 SWIG。P/Invoke 不是一个选项。

0 投票
10 回答
25597 浏览

python - Python:SWIG 与 ctypes

在 python 中,在什么情况下 SWIG 比 ctypes 更适合调用共享库中的入口点?假设您还没有 SWIG 接口文件。

两者的性能指标是什么?

0 投票
2 回答
1642 浏览

c++ - 使用 SWIG (AIX 5.1) 从 Perl 调用 C++ 库时崩溃

我试图在 AIX 5.1 机器上从 Perl 调用 C++ 库。我创建了一个非常简单的测试项目来尝试执行此操作。

我的 C++ 共享库 ( test.cpp):

我的 SWIG 接口文件(test.i):

然后我像这样构建共享对象:

此时,我有一个test.so应该可以在 perl 中加载的共享对象(通过生成的 SWIG test.pm)。我有一个非常简单的 perl 脚本来尝试加载共享对象并调用我正在导出的一个函数(test.pl):

当我运行时test.pl,我得到以下输出:

在 myfunc()
非法指令(核心转储)

如果我注释掉 中的std::cout用法myfunc,它可以正常工作。似乎在 C++ STL 中使用任何东西都会导致核心转储(我尝试只声明 a std::vectorand std::stringstream,两者都会导致核心转储)。我可以创建一个使用 STL 而没有任何问题的独立 C++ 可执行文件,只有在从 perl 加载时在我的共享对象中调用时,我才会遇到麻烦。

我也尝试过使用 xlc 而不是 gcc,但我得到了相同的结果。我在想我需要传递一些时髦的链接器标志以确保所有链接都正确发生?欢迎任何想法...

编辑:如果我使用gcc/链接xlc而不是直接调用链接器 ( ld),我会立即遇到分段错误。当 perl 试图简单地加载共享库时,它看起来像崩溃了。像上面那样调用ld是最接近工作的方法,但我认为我可能缺少一些库或 C++ 库的特殊 AIX 链接器标志。

Edit2:好的,我已经开始工作了。AIX 在链接方面非常脆弱。我最终想出了以下似乎工作正常的链接命令:

我链接的库是最相关的。事实证明,提到库的顺序也非常重要(呃)。另请注意,这是针对 AIX 5.1 附带的 Perl 5.6.0 构建的。我已经尝试针对 Perl 5.8.8 构建同样简单的应用程序,但它不起作用。但是,我很确定更理智的链接方法(使用直接gcc/xlc而不是直接调用ld)似乎效果更好。所以这个问题似乎是 Perl 发行版或链接器或其他东西中的错误。

希望这将帮助一些被诅咒不得不使用 AIX 的可怜的灵魂......

0 投票
4 回答
2910 浏览

python - 从python加载dll

我正在从我在这里找到的一些源代码构建一个 python 应用程序

我已经设法通过搜索网络来编译和修复一些问题,但我被困在这一点上:

运行应用程序时会出现此消息。

替代文字 http://img511.imageshack.us/img511/4481/loadfr0.png

这个 python 应用程序使用 swig 链接到 c/c++ 代码。

我有 VC++2005 速成版,我用它与 scons 和 Python 2.5 一起编译(也尝试过 2.4)

试图加载的 dll 是“msvcr80.dll”,因为在消息是“msvcr80.dll”之前找不到或类似的东西,所以我得到它并将它放在 window32 文件夹中。

对于我在这里读到的内容:http: //msdn.microsoft.com/en-us/library/ms235591 (VS.80).aspx

解决方案是使用清单和 dll 文件运行 MT。我已经这样做了,也不起作用。

谁能指出我正确的方向?

这是清单文件的内容:

我现在要尝试 Python 2.6,我不太确定是否理解这个问题,但是 Python 2.5 和 Python 2.5 .exe 在 .exe 文件中有字符串“MSVCR71.dll”。但这可能无关紧要。

附言。如果一切都像 jar 文件一样简单:(

这是完整性的堆栈跟踪

0 投票
1 回答
614 浏览

java - 在创建新包装器时引用现有的 SWIG 包装器

我有一个现有的库 (JPhysX),它是本机 C++ 库 (PhysX) 的 Java 包装器。Java 库使用 SWIG 生成的类型,例如 ,com.jphysx.SWIGTYPE_p_NxStream它表示指向NxStreamC++ 代码中对象的指针。现在我想创建我自己的继承自 C++ type 的 C++ 类NxStream,并让我的类的 Java 包装器也继承自 wrapper com.jphysx.SWIGTYPE_p_NxStream

问题是,当我调用 SWIG 为我的类生成包装器时,它还创建了一个名为 的新包装器SWIGTYPE_p_NxStream,它在功能上与 in 中的包装器相同com.jphysx,但就 Java 而言仍然是不同的类型。

我如何说服 SWIG 重用这个现有的包装器com.jphysx并让我的类的包装器继承自com.jphysx.SWIGTYPE_p_NxStream

0 投票
5 回答
12743 浏览

c++ - 向 Python 公开 C++ API

我目前正在做一个项目,我必须用 Python 包装 C++ 类才能编写程序脚本。所以我的具体经验还涉及在我们的程序中嵌入 Python 解释器。

我尝试的替代方案是:

  • Boost.Python

    我喜欢 Boost.Python 生成的更简洁的 API,但它需要用户安装额外的依赖项这一事实使我们切换到 SWIG。

  • 痛饮

    SWIG 对我们来说的主要优势是它不需要最终用户安装它来使用最终程序。

你以前做过什么,你有什么经验?

0 投票
2 回答
16771 浏览

c++ - 如何暴露 std::vector作为使用 SWIG 的 Python 列表?

我正在尝试使用 SWIG 将此函数公开给 Python:

我希望 SWIG 为 Python 生成包装代码,以便我可以将其视为整数列表。

将此添加到 .i 文件中:

我正在跑步SWIG Version 1.3.36并与 swig 通话-Wall,但没有收到任何警告。

我能够访问一个列表,但是在使用-Wall(with g++ (GCC) 4.2.4) 生成的 C++ 代码进行编译时会收到一堆警告,这些代码说:

我是否正确地公开了该功能?如果是这样,警告是什么意思?


这些是同一函数中违规行之前的行:

这是有问题的行:

更多代码如下。

使用 g++ 4.2.4 编译时产生的警告是:

0 投票
2 回答
1917 浏览

c# - 将 boost::signal 包装到 C# 委托

假设我有一个异步库,用本机 C++ 编写,接口类似于:

我想用 C# 包装。有谁知道一种方法,使用 SWIG 或类似的东西,可以让我将信号绑定到 C# 委托?