如何在tcl中的load命令中使用interp arg?

时间:2013-12-13 23:17:23

标签: tcl

我对tcl很新。

我正在尝试使用load命令加载一个dll但是我得到一个未定义的符号错误。

我很确定该消息暗示dll是针对特定(专有)解释器的。

如果我尝试从“wish”执行加载,我会收到错误,但如果我从专有解释器执行加载,则会加载错误。

我在load命令中看到我可以传入packageName和interp。 我想如果我传入专有的解释器,我也许可以让它工作,但如果我传入解释器的路径,我会收到一条错误消息,说它无法解释翻译器。 有谁知道interp =期待什么?

顺便说一下,我不能只使用专有的解释器,因为我真的只是试图从ruby调用tcl命令,而且我没有用该解释器编译ruby的头文件。

命令,我收到一条错误消息,说明有未定义的符号。

1 个答案:

答案 0 :(得分:2)

load命令执行两项操作:

  1. 它找到指定的共享库并使其在进程中“存在”。 (用于此的OS API各不相同;在Unix上通常为dlopen(),在Windows上为LoadLibraryEx()。)

  2. 然后它在库中定位初始化函数并调用它,将句柄传递给解释器,以获取库中的功能。初始化函数的名称通常来自库的名称;如果您正在加载foobar72.dll,则该函数将被称为Foobar_Init。 Tcl总是假设初始化函数的类型签名是这样的:

    int InitFunc(Tcl_Interp *interp);
    
  3. 我猜第一阶段有效,但第二阶段失败;没有初始化函数,并且该库不适用于Tcl。 (特别是,它也不知道如何使用Tcl的API来注册命令,设置变量等。)

    解决这个问题的方法是:

    1. 使用SWIG之类的工具创建包装库。
    2. 使用ffidl等Tcl扩展程序进行直接API调用。
    3. 使用像critcl这样的Tcl扩展名在Tcl中编写包装器库。
    4. 手工编写包装。 (这不是很难IMO,而是YMMV。)
    5. 你应该知道SWIG浮出的C API和ffidl通常在Tcl中感觉非常奇怪;你通常需要在它们周围编写更多的Tcl代码,以使界面自然。 (这不是对这些API的批评;只是承认C和Tcl语言对“自然”的含义有不同的概念。)

      要说出最好的方法是什么,我们需要更多的信息。你可能更好地将其作为一个单独的问题来表达。