【问题标题】:Why is my swig generated tcl code missing methods at runtime?为什么我的 swig 生成的 tcl 代码在运行时缺少方法?
【发布时间】:2021-07-02 21:56:48
【问题描述】:

我正在使用 swig 4.0.2 生成一个包供 tcl 使用。

源 .i 文件包含许多类,生成的 _wrap.cpp 文件包含所有类及其方法,正如我所期望的那样,一切编译正常,没有任何警告。

但是,对于至少 1 个类,当我从 tcl 脚本调用实例上的方法时,我收到一个运行时错误,指出该方法不存在。该错误还会转储该类的所有可用方法。我尝试调用的方法以及其他一些方法在该列表中不存在。

Invalid method. Must be one of: configure cget -acquire -disown -delete ...

尽管缺少哪些方法是一致的,但似乎没有任何方法不在列表中。

缺少的方法分散在声明的 swig 接口中。即它们不在开头或结尾,也不在一个块中。我看不到它们的名称和函数签名的模式。

发生错误时正在运行的函数是SWIG_Tcl_MethodCommand:swig生成的函数。它负责按名称查找方法并打印出错误代码。

函数包装器都存在并在类的swig_method 数组中引用。

我会想象,如果一个方法不会通过查找找到它,那将是全部或全部。

有人知道我可以在哪里查找错误吗? 恐怕我无法隔离成一个我可以分享的小测试用例。

我正在使用 swig 4.02,为 tcl8 生成代码并在 c++ 14 下编译。

【问题讨论】:

    标签: c++ tcl swig


    【解决方案1】:

    问题是复制粘贴代码引起的。

    我正在处理的项目中存在第二个 swig 包。它重新声明了相同的类接口,但缺少一些方法!

    如果我同步声明,那么一切正常。

    这就留下了一个问题,即带有不同步 swig 接口(使用 swig1.0 生成)的原始代码是如何工作的。

    【讨论】:

    • 这种奇怪的失败模式是为什么许多人使用持续集成工作流,从最可读的源代码的干净签出中干净地构建所有内容。它避免了构建目录被旧构建产品的“精神”“困扰”……
    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 2022-01-23
    • 1970-01-01
    • 2021-04-11
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多