【问题标题】:string arguments are not recognized by SWIGSWIG 无法识别字符串参数
【发布时间】:2017-11-07 18:17:36
【问题描述】:

我有一个令人沮丧的问题,我花了很多时间处理它,但我没有找到任何解决方案。

我想在 SWIG 中使用 PHP 中的 C++ 类。我生成了我的共享对象,它适用于某些方法,但是每当我使用字符串参数作为输入调用方法时,我都会遇到此错误:

致命错误:在PKI_Buf_initHex 的参数 2 中键入错误。期待SWIGTYPE_p_std__string

PKI_Buf_initHex 是 SWIG 自动创建的包装器类的名称。在我的 C++ 代码中,我将 initHex 方法声明为:

int initHex(const string x) 
{..}

我在我的接口文件中包含了typemaps.istd_string.i,但我得到了同样的错误信息。

如果有人能帮助我解决这个问题,我将不胜感激。

【问题讨论】:

  • 标题中必须有using namespace std;using std::string;。第一个是非常糟糕的形式,对 SWIG 来说非常非常糟糕。后者也是 SWIG 无法处理的。将你的函数声明为int initHex(const std::string x)(旁白:为什么是const?你在这里传递值。)
  • 首先非常感谢你的帮助,我检查了我的头文件,我有 using namespace std;所以我将其更改为“使用std :: string”并将我的函数更改为“int initHex(const std :: string x),但没有任何改变。我得到了同样的错误:(。知道吗?(旁白:我代码不是我自己实现的,我也没有看到源代码,我只有头文件和目标文件,我必须在PHP中开发代码以供某些用途。)
  • 实际上我检查了 SWIG wrap.cpp 文件中的代码,我发现 SWIG 很好地识别了字符串类型:
  • 您可能刚刚在 SWIG 接口文件中添加 %include <std_string.i> 为时已晚 - 它需要在 SWIG 看到 std::string 的任何用法之前出现。
  • @Flexo:显然这是我荒谬的错。非常感谢您的帮助,我非常感谢您在调试方面的专业水平;)

标签: c++ string swig


【解决方案1】:

你需要:

%include <std_string.i>

在 SWIG 界面中足够早(即在首次看到 std::string 之前)。

【讨论】:

  • 我在哪里可以找到有关其他类似内容的信息?是否需要使用 std::map、std::vector 等...?
  • @RaydelMiranda 如果文档没有说清楚,我只是阅读了 swig 源代码和库
  • 这里记录了 swig.org/Doc1.3/Library.html#Library_nn14 以及有关向量的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2013-02-17
  • 2018-05-10
  • 2019-02-18
  • 2020-12-18
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多