swig 对基类“std::string”一无所知,被忽略

Posted

技术标签:

【中文标题】swig 对基类“std::string”一无所知,被忽略【英文标题】:swig Nothing known about base class 'std::string', ignored 【发布时间】:2013-12-16 02:55:13 【问题描述】:

我正在尝试使用 swig 围绕 c++ 库构建 ruby​​ 包装器。 大部分似乎都在工作,但我有一个问题我很确定与上述警告有关。

看起来我要包装的类之一是从 std::string 继承的。

我在运行 swig 时看到上述警告消息。

当我在 ruby​​ 中调用应该返回字符串的对象上的方法时,我看到了这个

SWIG::Type_p_std__string:0x.....

我想我需要一些如何解决上述警告的问题,有什么想法吗?

【问题讨论】:

我认为您需要%include "std_string.i",然后您的课程才能被 swig 处理。 但是该文件会包含什么?我试图包括 但这没有影响 你百分比包括了吗?还是#include?请注意,这些在 SWIG 接口文件中是不同的。 std_string.i 由 swig 库提供 - 它不是 c++ 头文件。 好的,这有帮助...我刚刚添加了 %include std_string.i ...我收到了一些新警告,基类“std::string 不完整且仅前向声明 'std:: string' 被发现...是预期的,还是我应该做更多的事情,比如在 swig 命令行上包含一个路径? 【参考方案1】:

SWIG 抱怨它不知道 std::string 类,因此无法为其生成代码。

SWIG 库 std_string.i 具有用于将 c++ 字符串映射到目标语言字符串类的语言特定代码。在生成类的代码之前添加%include "std_string.i"之前应该可以修复错误。

请注意,%include 与 swig 接口文件中的 #include 不同。

【讨论】:

Gah ...我尝试了以下操作:%include "std_string.i"%include std_string.i 和 `%include 在 i 文件中的任何其他内容之前,它仍然为 C# 中的字符串生成 SWIGTYPE_p_string: / ...等等!修复。在头文件中我定义了字符串,它解析为一些奇怪的 typedef,我用 std::string 替换,一切都很好:)【参考方案2】:

当您在 SWIG 输出中看到 SWIG::Type_p_std__string 或类似的神秘类型时,这意味着缺少类型映射。在这里,SWIG 需要导出 std::string。通常这是因为它在函数调用参数中使用或作为您正在导出的函数中的返回值;在您的情况下,这是因为 std::string 是一个基类。 SWIG 包含一个用于常用 STL 类(如字符串和向量)的类型映射“库”,您只需通过 %include 指令导入它。有关 SWIG 中包含的其他 .i,请参阅 http://www.swig.org/Doc2.0/Library.html

【讨论】:

以上是关于swig 对基类“std::string”一无所知,被忽略的主要内容,如果未能解决你的问题,请参考以下文章

[swig-JavaScript] 是不是支持 std::vector<std::string>* 作为输出?

将 SWIG 与将 std::string 作为参数的方法一起使用

有其他虚拟基类时如何避免对基类函数的模糊调用

Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数

C# SWIG 向量<字符串> 到字符串 []

对基类成员数据的派生模板类访问