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

如何在tcl中的load命令上使用interp arg?,tcl,Tcl,我对tcl很陌生 我试图使用load命令加载dll,但出现未定义的符号错误 我很确定这条消息暗示dll是用于特定(专有)解释器的 如果我尝试从“wish”加载,我会得到错误,但是如果我从专用解释器加载,它会加载得很好 我看到,在load命令中,我可以传入packageName和interp。 我在想,如果我传入专有的解释器,我可能可以让它工作,但是如果我传入解释器的路径,我会收到一条错误消息,说它不能对解释器进行罚款。 有人知道interp=期望的是什么吗 顺便说一句,我不能只使用专有的解释器,

我对tcl很陌生

我试图使用load命令加载dll,但出现未定义的符号错误

我很确定这条消息暗示dll是用于特定(专有)解释器的

如果我尝试从“wish”加载,我会得到错误,但是如果我从专用解释器加载,它会加载得很好

我看到,在load命令中,我可以传入packageName和interp。 我在想,如果我传入专有的解释器,我可能可以让它工作,但是如果我传入解释器的路径,我会收到一条错误消息,说它不能对解释器进行罚款。 有人知道interp=期望的是什么吗

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


对于这些命令,我会收到一条错误消息,指出存在未定义的符号。

加载命令有两个作用:

  • 它定位指定的共享库并使其在过程中“存在”。(用于此操作的操作系统API各不相同;在Unix上通常是
    dlopen()
    ,在Windows上则是
    LoadLibraryEx()

  • 然后,它在库中定位初始化函数并调用它,将句柄传递给解释器,解释器将从库中获得功能。初始化函数的名称通常来源于库的名称;如果您正在加载
    foobar72.dll
    ,则该函数将被调用
    Foobar\u Init
    。Tcl始终假定初始化函数的类型签名如下:

    int InitFunc(Tcl_Interp*Interp);
    
  • 我猜第一阶段成功了,但第二阶段失败了;目前没有初始化功能,而且该库不是为与Tcl一起使用而设计的。(特别是,它也不知道如何使用Tcl的API来注册命令、设置变量等。)

    解决此问题的方法有:

  • 使用类似的工具创建包装器库
  • 使用Tcl扩展来执行直接API调用
  • 使用像在Tcl中编写包装器库这样的Tcl扩展
  • 用手写包装纸。(在我看来,这并不难,但是YMMV。)
  • 您应该知道,SWIG和ffidl出现的C api在Tcl中通常感觉非常奇怪;您通常需要围绕它们编写更多的Tcl代码,以使界面自然。(这不是对这些API的批评;只是承认C语言和Tcl语言对“自然”的含义有不同的理解。)


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

    如果您想查看一个相当典型的初始化函数,这是非常合理的。它调用
    Tcl\u InitStubs
    (以获得API/ABI访问权),向
    Tcl\u CreateObjCommand
    注册一些命令,然后调用
    Tcl\u PkgProvideEx
    将包标记为正确存在。谢谢,我也尝试了swig方法,但我也遇到了问题,请参见:@nPn:我自己不使用swig方法,但是当接口C++(与C相反)时,最好手工编写包装器。当然,它的难度取决于细节,但需要记住的关键是,Tcl是作为C库实现的,所有回调都必须是函数(不是方法,也不是直接调用)并具有C链接。谢谢,但我实际上正在尝试使用ruby。。。上面提到的原因是有可用的tcl绑定,但是当我尝试加载它们时,会收到上面提到的错误消息。我实际上是在尝试从ruby调用tcl函数。所以我想试试SWIG。@nPn去Ruby?使用基本库可能是一种合理的方法。(不过我也无能为力;我根本不知道Ruby的C API。)